我有一个包含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);
答案 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条规则的示例,假设您有列a
,b
和c
。在Assiditonally,假设b
只能采用5个不同的值(比如1到5),而a
可以采用超过5个值。有趣的是,假设您只想运行类似
a=? AND b=? AND c>=?
然后你应该将c
放在最后(因为比较)而a
放在b
之前,因为a
有更多的值。因此,您必须使用以下顺序:(a,b,c)
。