MySQL优化常用办法
1. 拔取最适用的字段属性
表中字段的宽度设得尽大概小:char 的上限为 255 字节(牢固占用空间),varchar 的上限 65535 字节(实际占用空间),text 的上限为 65535。
尽量把字段设定为 NOT NULL,施行查询的时候,数据库不消去比力 NULL 值。
2. 使用连接(JOIN)来代替子查询 (Sub-Queries)
连接(JOIN)之所以更有效力一些,是由于 MySQL 不需要在内存中创立暂时表来完成这个逻辑上的需要两个步骤的查询工作(结合查询的前提加索引更快)。
3. 使用结合 (UNION) 来代替手动创立的暂时表
把需要使用暂时表的两条或更多的 SELECT 查询合并的一个查询中。
SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author UNION SELECT Name, Supplier FROM product;
4. 事务
尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和结合(UNION)来创立许许多多的查询,但不是所有的数据库操纵都可以只用一条或少数几条 SQL 语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。
作用是:要末语句块中每条语句都操纵成功,要末都失败。换句话说,就是可以保持数据库中数据的一致性和完全性。事物以 BEGIN 关键字开端,COMMIT 关键字完毕。在这之间的一条 SQL 操纵失败,那么,ROLLBACK 命令就可以把数据库复原到 BEGIN 开端此前的状态。
5. 锁定表
尽管事务是保护数据库完全性的一个非常好的办法,但却由于它的独占性,有时会影响数据库的机能,特别是在很大的利用系统中。由于在事务施行的历程中,数据库将会被锁定,因此其它的会员恳求只能临时等候直到该事务完毕。
LOCK TABLE inventory WRITE
SELECT Quantity FROM inventory
WHEREItem='book';
...
UPDATE inventory SET Quantity=11
WHEREItem='book';
UNLOCK TABLES
这里,我们用一个 SELECT 语句取出初始数据,通过一些运算,用 UPDATE 语句将新值更新到表中。包括有 WRITE 关键字的 LOCK TABLE 语句可以包管在 UNLOCK TABLES 命令被施行此前,不会有其它的拜访来对 inventory 停止插入、更新或者删除的操纵。
6、使用外键
锁定表的办法可以保护数据的完全性,但是它却不克不及包管数据的关联性。这个时候我们就可以使用外键。例如,外键可以包管每一条零售记载都指向某一个存在的客户。在这里,外键可以把 customerinfo 表中的 CustomerID 映射到 salesinfo 表中 CustomerID,任何一条没有合法 CustomerID 的记载都不会被更新或插入到 salesinfo 中。
CREATE TABLE customerinfo ( CustomerID INT NOT NULL , PRIMARY KEY ( CustomerID ) ) TYPE = INNODB; CREATE TABLE salesinfo ( SalesID INT NOT NULL, CustomerID INT NOT NULL, PRIMARY KEY(CustomerID, SalesID), FOREIGN KEY (CustomerID) REFERENCES customerinfo (CustomerID) ON DELETECASCADE ) TYPE = INNODB;
留意例子中的参数 “ON DELETE CASCADE”。该参数包管当 customerinfo 表中的一条客户记载被删除的时候,salesinfo 表中所有与该客户相关的记载也会被主动删除。假如要在 MySQL 中使用外键,必然要记住在创立表的时候将表的类型定义为事务平安表 InnoDB 类型。该类型不是 MySQL 表的默许类型。定义的办法是在 CREATE TABLE 语句中加上 TYPE=INNODB。
7. 使用索引
查询语句傍边包括有 MAX (), MIN () 和 ORDERBY 这些命令的时候,机能提高更为明显。
索引应创立在那些将用于 JOIN, WHERE 推断和 ORDER BY 排序的字段上。尽量不要对数据库中某个含有大量反复的值的字段创立索引。关于一个 ENUM 类型的字段来说,显现大量反复值是很有大概的状况,例如 customerinfo 中的 “province”.. 字段,在这样的字段上创立索引将不会有什么帮忙;相反,还有大概落低数据库的机能。
8. 优化的查询语句
SELECT FROM order WHERE YEAR(OrderDate)<2001;
SELECT FROM order WHERE OrderDate<"2001-01-01";
SELECT FROM inventory WHERE Amount/7<24;
SELECT FROM inventory WHERE Amount<24*7;
幸免在查询中让 MySQL 停止主动类型转换,由于转换历程也会使索引变得不起作用。
更多SQL的相关技术文章,请拜访SQL教程栏目停止学习!
以上就是MySQL优化常用办法的具体内容,更多请关注百分百源码网其它相关文章!