【问题标题】:Postgres order of combined indexPostgres 组合索引的顺序
【发布时间】:2016-09-26 03:19:18
【问题描述】:

我有一个表包含 10M 行数据

CREATE TABLE log_info
(
  id serial NOT NULL,
  created_date date, # date in month - max 30-31 distinct value
  dept_id integer, # max 50 distinct value
  group_id integer, # 10000 distinct value
  .......
)

大多数查询是基于 created_datedept_idgroup_id,所以我想为 3 个字段创建组合索引

我知道组合索引的顺序会影响数据库性能,那么在我的情况下,哪个是最好的索引?

CREATE INDEX log_info_index1 ON log_info USING btree (created_date, dept_id, group_id);

CREATE INDEX log_info_index1 ON log_info USING btree (created_date, group_id, dept_id);

【问题讨论】:

    标签: database performance postgresql indexing


    【解决方案1】:

    哪种顺序最好取决于您计划运行哪种查询。考虑以下示例:

    WHERE created_date=? AND dept_id=?
    WHERE created_date=? AND dept_id>=?
    WHERE created_date=? AND dept_id=? AND group_id BETWEEN ? AND ?
    

    对于所有这些,可以使用索引(created_date, dept_id, group_id),而不能使用索引(created_date, group_id, dept_id)。一般来说,如果你在(a,b,c)上有一个索引,那么它可以用于以下情况

    a=?
    a=? AND b=?
    a=? AND b=? AND c=?
    a=? AND {comparison involving b}
    a=? AND b=? AND {comparison involving c}
    

    其中比较表示<<=between 之一。

    如果你知道你永远不会使用比较,那么你应该把值最多的列放在第一位。

    因此,对于结合上述 2 条规则的示例,假设您有列 abc。另外,假设b 只能取5 个不同的值(比如1 到5),而a 可以取多于5 个的值。有趣的是,假设您只想运行类似

    的查询
    a=? AND b=? AND c>=?
    

    那么你应该把c放在最后(因为比较)和ab之前,因为a有更多的值。因此,您必须使用以下顺序:(a,b,c)

    【讨论】:

    • 如果 a 有 5 个不同的值,b 有 100 个不同的值,c 有 5000 个不同的值并且查询 a=?和 b=?和 c>=?。哪个是最好的订单指数? (a,b,c), (a,c,b), (c, b, a), ....
    • 然后(b,a,c)
    猜你喜欢
    • 2012-09-23
    • 2021-06-23
    • 2021-06-14
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多