Postgres中表的最佳索引

时间:2019-02-28 18:09:26

标签: postgresql indexing database-performance unique-constraint

假设我有下表

CREATE TABLE tbl
(
  id uuid NOT NULL DEFAULT gen_random_uuid(),
  col_a uuid NOT NULL,
  col_b character varying NOT NULL,
  PRIMARY KEY (id)
);

我希望它在(col_a,col_b)上是唯一的,所以我还将创建以下索引

CREATE UNIQUE INDEX tbl_unique_idx ON tbl USING btree (col_a, col_b);

到目前为止,我的问题是,鉴于我希望以下两个查询能够充分利用索引,我是否需要其他索引?

SELECT * FROM tbl WHERE col_a=$1 ORDER BY col_b;

SELECT * FROM tbl WHERE col_a=$1 AND col_b=$2;

基本上,我们将始终对col_a进行过滤,Postges可以在这里利用tbl_unique_idx吗? 我们还总是对col_b进行排序或过滤(除了对col_a进行过滤),因此它可以利用相同的索引还是会需要自己的索引?

表可能会到达数百万条记录,因此我希望没有多余的索引。我目前正在使用PostgreSQL 10,但如果有明显的好处,则可以升级到11。

1 个答案:

答案 0 :(得分:1)

您创建的索引将完美地为您的两个查询服务。无法改善。

我会创建一个唯一的约束,而不是一个唯一的 index 。这样,您也可以在需要时使用INSERT ... ON CONFLICT

您可能不希望在代码中使用SELECT *。首先,这意味着如果添加额外的列,您的代码可能会中断,但是如果仅获取您真正需要的列,则这也会提高性能,特别是如果某些数据在TOAST表中。