慢查询的怀疑方向
- 索引设计有问题
- SQL语句有问题
-
覆盖索引
查询语句从执行到返回结果均使用同一个索引
- 覆盖索引通过取消回表操作,提升查询效率
-
索引基数
根据索引基数,可以判断索引性能的好坏
-
count()函数
count(非索引字段):无法使用覆盖索引,最慢
- count(索引字段):可以使用覆盖索引但依然要取出数据判空
- count(1):不需要取出数据,但需要判断“1是否为null”
-
ORDER BY
MySQL排序一般需要生成中间结果集、排序、回表的过程
-
随机选取
临时优化:使用SQL语句选出随机主键
-
索引下推
-
松散索引扫描
-
字段做函数操作
MySQL中,对索引字段做函数操作,优化器会放弃索引
- 这种情况可能包括:时间函数,字符串转数字,字符编码转换
-
分页查询
排序偏移量大时,会丢弃大量无用数据,导致效率低下
- 可以采取先索引覆盖,再用最终ID回表的方法,优化效率