You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:59:19