【问题标题】:PostgreSQL - should i only create index for the rest of columns that don't have index yet?PostgreSQL - 我应该只为其他还没有索引的列创建索引吗?
【发布时间】:2021-04-18 01:39:29
【问题描述】:

如果 table_name 有 3 列 (a,b,c),我将用这 3 列创建索引:

CREATE INDEX idx_table_name_a_b_c ON table_name (a,b,c);

但是我之前创建的列 a 已经有一个索引:

CREATE INDEX idx_table_name_a ON table_name (a);

我应该只为其他 2 列创建,还是为还包含 a 列的那 3 列创建(使用上述查询)?

【问题讨论】:

  • 您可以删除idx_table_name_a - 使用(a) 上的索引的任何查询也可以使用(a,b,c) 上的索引。您是否“应该”创建其他索引完全取决于您的查询。

标签: postgresql indexing multiple-columns


【解决方案1】:

请注意,仅当您有查询时才可能考虑索引。像这样对表进行索引是没有意义的,而只是为了查询而对表进行索引。

所以让我们假设您有一个可以从三列索引中受益的查询,例如

SELECT count(*) FROM table_name
WHERE a = 12 AND b = 42 AND c BETWEEN 7 AND 22;
  • 最好的选择是创建该索引并删除现有的索引,因为三列索引可以满足单列索引所能达到的所有目的(这是因为a 是索引中的前导列)。

    这样的索引将导致对表进行一次仅索引扫描,这(如果您有VACUUMed 表)是执行查询的最有效方式。

  • 第二个最佳选择是创建您建议的双列索引,并将单列索引保留在a

    那么优化器的策略将取决于值的分布。

    • 如果a 上的条件具有足够的选择性,PostgreSQL 将忽略您的新索引,只扫描a 上的那个。

    • 如果bc 的条件是选择性的,PostgreSQL 将只扫描你的新索引。

    • 如果所有条件都不是选择性的,PostgreSQL 可能会选择对表进行顺序扫描并忽略所有索引。

    • 如果a 上的条件和bc 上的条件都不是选择性的,但所有三个条件一起都是选择性的,PostgreSQL 可以选择对两个索引执行位图索引扫描并组合结果.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 2011-08-24
    • 2018-05-15
    • 2018-07-05
    • 1970-01-01
    • 2017-03-19
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多