【问题标题】:postgres partial indexpostgres 部分索引
【发布时间】:2012-09-06 10:10:10
【问题描述】:

我有一个大约有 30 列的表,其中列a integer not nullb 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 列,如下所示:

创建索引 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 是什么意思?

【问题讨论】:

  • 请向我们展示与解释输出相对应的select 语句
  • @a_horse_with_no_name SRY,完成。

标签: postgresql indexing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    我希望(c,a,b) 上的索引表现相同(注意与您的三列索引相比的不同顺序)。

    【讨论】:

    • > 我希望 (c,a,b) 上的索引具有相同的行为方式......而且确实如此,不像 MySQL ;)
    猜你喜欢
    • 2019-10-02
    • 2020-12-24
    • 2023-03-06
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 2019-10-06
    • 2022-08-16
    • 2012-06-12
    相关资源
    最近更新 更多