sql形为
select ... where a=xx order by b limit c
# 在字段a和字段b上均设置了索引
执行时可能由于MySQL选择的索引不符合预期导致慢查询
理想情况是查询时选用where筛选字段相关的索引加速,即选用和字段a 相关的索引,但实际查询时mysql选用了和字段b 相关的索引
原因是:
- mysql优化器认为如果不走b字段索引,在查询出结果后还需要排序,而走b字段索引只需要顺序扫描,且扫到满足limit c就行了,效率比选取其他索引高,所以选择了b索引而不是理想的a索引
- 如果字段b没有索引,不会出现上述情况
- 如果没有limit关键字,也不会出现上面的情况。
这种问题较为隐蔽,不太容易在编写sql时注意到,所以在大表中写查询语句时最好去提前用explain执行看一下是不是符合预期