Oracle复合索引创建顺序最佳实践:(date,type)还是(type,date)?
复合索引选择问题解答
一、WHERE条件为date=? AND type=?时的索引选择
优先选择**(date, type)**作为复合索引,原因如下:
- 复合索引遵循「高选择性字段前置」的核心原则:
date是等值匹配,单个date对应的记录数远小于type的分组规模(比如type=A就占85%的数据)。先通过date把查询范围缩小到某一天的记录,再用type做二次过滤,能快速定位目标数据。 - 如果用
(type, date),假设查询type=A,第一步就会拉出85%的全表数据,再在这海量数据里过滤date,磁盘IO和内存开销都会大幅增加,效率远低于前者。
二、仅过滤type=C时的索引选择
这种场景下**(type, date)索引更优**,理由如下:
type=C仅占全表5%的数据,(type, date)索引的第一个字段是type,等值匹配type=C时,能直接定位到这5%的索引条目,瞬间过滤掉95%的无关数据,查询效率极高。- 如果用
(date, type)索引,由于type是索引的第二个字段,数据库无法直接通过type=C快速定位,只能遍历所有date分组下的type值,相当于做一次索引全扫描,性能差距明显。
内容的提问来源于stack exchange,提问作者Zizou
相关产品推荐
相关产品推荐

