唯一复合索引对仅查询首列的效率是否等同非复合索引?是否需删原索引?
单列索引 vs 复合唯一索引:取舍与效率问题
是否要删除现有的单列A索引?
必须删。原因很明确:
- 复合索引
(A, B)的前缀是A,完全能覆盖所有仅针对A列的查询需求,留着单列索引纯属冗余。 - 多一个索引就多一份维护成本:每次增删改数据时,数据库得同时更新两个B-tree索引,会额外消耗IO和CPU资源,拖慢写操作的速度,完全没必要。
仅查询A列时,复合索引和单列索引效率一样吗?
几乎没差别。
- B-tree索引的排序特性决定了,复合索引里的A列是有序排列的,查询A列时,优化器会直接遍历复合索引的A分支,和单列索引的查找逻辑本质相同。
- 唯一的细微差异是复合索引每条记录附带了B列的值,索引体积比单列索引略大,可能会有极微小的IO开销,但这种差异在绝大多数业务场景下根本感知不到。
补充提醒
- 如果有基于A列的排序、分组操作,复合索引同样能胜任,因为A列本身是有序的。
- 以后要是有同时涉及A和B的查询需求,这个复合索引还能直接覆盖查询,不用回表读取原数据,效率比单独维护两个索引更高。
内容的提问来源于stack exchange,提问作者asymmetriq
相关产品推荐
相关产品推荐

