MySQL中SUM函数场景:单列索引与(col1,col2)覆盖索引哪个更优?
单列索引 vs (col1, col2)覆盖索引:哪个更适配你的查询?
咱们先拆解下你的目标查询语句:
SELECT col1, SUM(DISTINCT col2) AS S FROM tbl1 WHERE col1='abbc' GROUP BY col1 ORDER BY S ASC
核心逻辑是过滤出col1='abbc'的行,计算col2去重后的总和,再返回排序结果。下面具体对比两种索引的表现:
1. 单列索引 col1 的实际表现
这个索引确实能帮你快速定位到所有col1='abbc'的行,但有个关键局限:索引里只存储了col1的值和对应的主键ID。数据库找到这些主键后,还得回表(去主键索引里取出对应的col2值)才能完成SUM(DISTINCT col2)的计算。
如果符合条件的行数不多,回表的开销可能不明显,但一旦数据量上去,大量的回表IO会直接拖慢查询速度。
2. 覆盖索引 (col1, col2) 的核心优势
这才是更适配你查询的最优解!因为它包含了查询需要的所有列:
col1用于快速过滤出目标行;col2直接存储在索引里,完全不需要回表就能获取。
数据库全程只需要操作这个二级索引,彻底避免了回表的IO开销。而且对于InnoDB来说,二级索引是按索引列顺序存储的——同一个col1下的col2是有序排列的,这还能让SUM(DISTINCT col2)的去重计算更高效(有序数据去重比无序数据快很多)。
总结
覆盖索引(col1, col2)比单列索引col1有用得多,尤其是当col1='abbc'对应的行数较多时,性能差异会非常明显。如果这个查询是高频执行的,强烈建议创建这个覆盖索引。
内容的提问来源于stack exchange,提问作者user24533435
相关产品推荐
相关产品推荐

