Postgres综合指数的顺序

时间:2016-09-26 03:19:18

标签: database performance postgresql indexing

我有一个包含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_date dept_id group_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);

1 个答案:

答案 0 :(得分: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。在Assiditonally,假设b只能采用5个不同的值(比如1到5),而a可以采用超过5个值。有趣的是,假设您只想运行类似

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

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