一、group by优化
1、使用索引优化;
2、group by使用索引时,explain-extra值为Using index ,未使用索引或索引失效,explain-extra值为Using temporary 。
二、order by优化
1、使用索引优化;
2、order by使用索引时,explain-extra值为Using index ;未使用索引或索引失效,explain-extra值为Using filesort 。
三、 limit优化
1、使用索引优化
**当一个表中有几百万的数据的时候,**select * from table limit 0,10 这个sql语句性能没有问题 ,但当 limit 200000,10 的时候会出现问题:因为如上语句未使用索引,会扫描全表。
2、优化方式为:索引+连接查询,例如:
SELECT *
FROM tb_sku t,
(
SELECT id
FROM tb_sku
ORDER BY id
LIMIT 2000000,10) a
WHERE t.id = a.id;
四、count用法
count用法有:count(*)、count(主键)、count(字段)、count(1):
count用法 | 含义 |
---|---|
count(主键) | InnoDB 引擎会遍历整张表,把每一行的 主键id 值都取出来进行累加(主键不可能为null) |
count(字段) | 1、字段没有not null 约束 : InnoDB 引擎会遍历整张表把每一行的字段值都取出来,判断是否为null,不为null,计数累加。2、字段有not null 约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,然后进行累加。 |
count(1) | InnoDB 引擎遍历整张表,但不取值。而是对于返回的每一行,放一个数字“1”进去,然后累加 |
count(*) | InnoDB引擎针对count(*)专门做了优化:遍历整张表,直接按行进行累加。 |
1、按照效率排序的话,count(字段) < count(主键 id) < count(1) ≈ count(*),所以尽量使用count(1)或 count(*)。
2、count(1)或 count(*)直接按行累加,少了取值操作,所以效率最高;
3、count(字段)因为还有判空,所以效率最低
五、sql性能优化总结
1、crud的性能优化,主要是针对索引进行优化的
2、sql性能优化面试中常问,需要关注下
1、从开发者视角学习MYSQl系列文章:https://blog.csdn.net/maoxuemin/article/details/123523457;
2、快速问答:https://gitee.com/wendakuai/introducton/wikis/question