postgres部分索引

时间:2012-09-13 10:31:28

标签: postgresql indexing

我有一个包含大约30列的表格,其中包括a integer not null列,b boolean not nullc 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

问题是:我应该在部分索引中包含ab列,如下所示:

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是什么意思?

2 个答案:

答案 0 :(得分:3)

如果索引谓词是严格相等的,则在索引中包含谓词列是没有意义的。每个索引条目都具有相同的列值,因此不会有助于索引查找,它们只会减慢插入和查找速度并使索引膨胀。

答案 1 :(得分:1)

我的猜测(!)是:在第一种情况下(三列索引),除了现有的“索引条件”之外,需要评估的列位于索引的末尾,因此索引扫描需要进行评估条件不同。

在第二种情况下(单列索引)where条件中使用的列(除已经“索引条件”之外的索引是索引的前导列,可以更有效地使用。

我希望(c,a,b)上的索引行为方式相同(注意与三列索引相比的顺序不同)。