Mysql基本语句优化10个原则

| 分类:Mysql | 评论: 0 | 浏览:285

原则一

尽量避免在列上进行运算,这样会导致索引失效
SELECT * FROM t WHERE YEAR(d) >=2018;

优化

SELECT * FROM t WHERE d>= '2018-01-01'

原则二

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

原则三

注意LIKE模糊查询的使用,避免%%
SELECT * FROM t WHERE name LIKE '%zuo%'

优化

SELECT * FROM t WHERE name>='zuo' AND name <'zun'

原则四

仅列出需要查询的字段,这对速度不会有明显影响,主要考虑节省内存
SELECT * FROM `users`;

优化

SELECT username,password,nickname FROM `users`

原则五

使用批量插入语句节省交互
INSERT INTO log(id,name) VALUE (1,`name1`);
INSERT INTO log(id,name) VALUE (2,`name2`);
INSERT INTO log(id,name) VALUE (3,`name3`);

优化

INSERT INTO log(id,name) VALUE (1,`name1`),(2,`name2`),(3,`name3`);

原则六

limit的基数比较大时使用between
SELECT * FROM log LIMIT 999999,10;

优化

SELECT * FROM log WHERE id between 999999 AND between 1000009,10;

between限定比limit快,所以在海量数据访问时,建议用between或是where替换掉limit。但是between有个缺陷,如果id中间有断行或是中间部分id不读取的情况,读取的数量总会少于预计数量

在取后面的数据时,通过desc方式把数据反向查找,以减少对前段数据的扫描,让limit的基数越小越好

原则七

不要使用rand函数获取多条随机记录

原则八

避免使用null

原则九

不要使用count(id),而应该使用count(*)

count(id)在使用聚合函数或者分组时可能会使结果跟预计中不一样

原则十

不要做无谓的排序操作,应该尽可能在索引中完成排序
Responses