MySQL查询不走理想索引

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执行看一下是不是符合预期

上一篇:第05章_排序与分页


下一篇:FastAPI+pydantic+SQLAlchemy返回多个数据