筛选索引中谓词列的位置选择:前部、后部或其他方案?
筛选索引的列设计疑问与实践总结
筛选索引基础语法
创建筛选索引的语法如下:
CREATE INDEX index_name ON table_name ( column_list ) WHERE predicate;
我了解到谓词中涉及的列需要包含在索引列列表中,但测试以下几种设计(及其他变体)时,并未发现差异,查询分析器每次都会选择相同的索引。
测试的索引设计场景
场景1:谓词列置于索引列列表前部
CREATE INDEX index_name ON table_name ( predicateColumn, column_list ) WHERE predicate;
场景2:谓词列置于索引列列表后部
CREATE INDEX index_name ON table_name ( column_list, predicateColumn ) WHERE predicate;
场景3:谓词列置于包含列列表中
CREATE INDEX index_name ON table_name ( column_list ) INCLUDE ( predicateColumn, column_list ) WHERE predicate;
场景4:完全省略谓词列
CREATE INDEX index_name ON table_name ( column_list ) INCLUDE ( column_list ) WHERE predicate;
我原本认为场景1是正确方案,但希望得到相关见解。我的测试表包含几十万条记录,本以为能看到差异,但结果均一致。我搜索了大量关于筛选索引的问题,但未找到针对该特定问题的解答。
总结
根据反馈,我会根据使用场景选择场景1或场景3:
- 场景3可实现覆盖索引,避免不必要的查找。
- 场景1除具备上述优势外,还能在谓词与语句存在差异时提供额外支持。
我个人倾向于将场景1作为通用推荐方案。
内容的提问来源于stack exchange,提问作者Storm
相关产品推荐
相关产品推荐

