MySQL多列索引使用疑问:现有索引能否满足查询需求?
关于SQL查询的索引利用问题
问题描述
执行如下SQL查询:
select * from table where f1='f1' and f2='f2' and f3='f3'
目前已创建f1_f2和f2_f3两个多列索引,询问该查询能否利用这两个索引,还是需要新建f1_f2_f3多列索引。
解答
- 这个查询无法同时利用
f1_f2和f2_f3两个多列索引,多数数据库的优化器只会选择其中一个最匹配的索引执行查询,不会同时启用两个多列索引做合并(特殊索引合并场景极少且性能未必更优)。 - 现有索引的作用:
- 使用
f1_f2索引时,会先快速筛选出满足f1='f1' and f2='f2'的数据,之后再在这个子集里过滤f3='f3'的记录; - 使用
f2_f3索引时,逻辑类似,先筛f2='f2' and f3='f3',再过滤f1='f1'。
- 使用
- 是否需要新建
f1_f2_f3索引:- 如果该查询执行频率高,且现有索引筛选后剩余的数据量仍较大,建议新建
f1_f2_f3多列索引。这个索引可以直接通过三个等值条件精准定位目标数据,避免二次过滤,查询性能会更优; - 如果查询频率低,或者现有索引已经能将数据量过滤到极小,就没必要额外创建索引——毕竟索引会增加数据写入、更新时的开销。
- 如果该查询执行频率高,且现有索引筛选后剩余的数据量仍较大,建议新建
内容的提问来源于stack exchange,提问作者LookIntoEast
相关产品推荐
相关产品推荐

