那些年的记忆

习惯改变行为,行为决定命运。

数据库优化之基本语句优化10个原则

原则1. 尽量避免在列上进行计算,这样会导致索引失效。

如:

SELECT * FROM t WHERE YEAR(d) >= 2011;

优化为:

SELECT * FROM t WHERE d >= '2011-01-01';


原则2. 使用JOIN时,应该用小结果集驱动大结果集。同时把复杂的JOIN查询拆分成多个Query。因为JOIN多表时,可能导致更多的锁定和阻塞。

如:

SELECT * FROM a JOIN b ON a.id = b.id 
LEFT JOIN c ON c.time = a.date 
LEFT JOIN d ON c.pid = b.aid 
LEFT JOIN e ON e.cid = a.did


原则3. 注意LIKE模糊查询的使用,避免%%。

如:

SELECT * FROM t WHERE name LIKE '%de%';

优化为:

SELECT * FROM t WHERE name >= 'de' AND name < 'df';


原则4. 仅列出需要的字段,这对速度不会有明显影响,主要考虑节省内存。

如:

SELECT * FROM member;

优化为:

SELECT id, name, pwd FROM member;


原则5. 使用批量插入语句节省交互。

如:

INSERT INTO t(id, name) VALUES(1, 'a');
INSERT INTO t(id, name) VALUES(2, 'b');
INSERT INTO t(id, name) VALUES(3, 'c');

优化为:

INSERT INTO t(id, name) VALUES(1, 'a'),(2, 'b'),(3, 'c');


原则6. LIMIT的基数比较大时使用BETWEEN。

如:

SELECT * FROM article ORDER BY 1000000, 10;

优化为:

SELECT * FROM article WHERE id BETWEEN 1000000 AND 1000010 ORDER BY id;


原则7. 不要使用rand函数获取多条随机记录。

如:

SELECT * FROM table ORDER BY rand() LIMIT 20;

优化为:

SELECT * FROM table AS t1 JOIN (SELECT ROUND(ROUND() * ((SELECT MAX(id) FROM table) - (SLECT MIN(id) FROM table)) + (SELECT MIN(id) FORM table)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1;


原则8. 避免使用NULL。

原则9. 不要使用COUNT(id), 而应该是COUNT(*)。

原则10. 不要做无谓的排序操作,而应尽可能在索引中完成排序。


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。