3

我有一个大约有 30 列的表, column a integer not nullb 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

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

创建索引 idx_my_table_a_b_c
在 my_table 上
使用 btree (a, b, c)
其中 a = 2 且 b 为真;

或者我不应该像这样:

创建索引 idx_my_table_a_b_c
在 my_table 上
使用 btree (c)
其中 a = 2 且 b 为真;

在第一种情况下explain输出

“在 my_table 上使用 idx_my_table_a_b_c 进行索引扫描(成本=0.00..8.27 行=1 宽度=4007)”
" 索引条件:((b = true) AND (a = 2))"

第二Index cond部分没有

“在 my_table 上使用 idx_my_table_a_b_c 进行索引扫描(成本=0.00..8.27 行=1 宽度=4007)”

顺便说一句,这是什么Index cond意思?

4

2 回答 2

3

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

于 2012-09-13T15:09:44.507 回答
1

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

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

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

于 2012-09-13T10:45:09.703 回答