我有一个包含大约30列的表格,其中包括a integer not null
列,b boolean not null
和c integer not null
。并且有一个查询通常与a = 2 and b is true and c = <something>
一起运行,即
select * from my_table where a = 2 and b is true and c = 3215
问题是:我应该在部分索引中包含a
和b
列,如下所示:
CREATE INDEX idx_my_table_a_b_c ON my_table USING btree (a, b, c) WHERE a = 2 AND b IS TRUE;
或者我不应该这样:
CREATE INDEX idx_my_table_a_b_c ON my_table USING btree (c) WHERE a = 2 AND b IS TRUE;
在第一种情况下explain
输出
"Index Scan using idx_my_table_a_b_c on my_table (cost=0.00..8.27 rows=1 width=4007)" " Index Cond: ((b = true) AND (a = 2))"
并且在第二个Index cond
部分缺席
"Index Scan using idx_my_table_a_b_c on my_table (cost=0.00..8.27 rows=1 width=4007)"
那么Index cond
是什么意思?
答案 0 :(得分:3)
如果索引谓词是严格相等的,则在索引中包含谓词列是没有意义的。每个索引条目都具有相同的列值,因此不会有助于索引查找,它们只会减慢插入和查找速度并使索引膨胀。
答案 1 :(得分:1)
我的猜测(!)是:在第一种情况下(三列索引),除了现有的“索引条件”之外,需要评估的列位于索引的末尾,因此索引扫描需要进行评估条件不同。
在第二种情况下(单列索引)where条件中使用的列(除已经“索引条件”之外的索引是索引的前导列,可以更有效地使用。
我希望(c,a,b)
上的索引行为方式相同(注意与三列索引相比的顺序不同)。