假设我有下表
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。
答案 0 :(得分:1)
您创建的索引将完美地为您的两个查询服务。无法改善。
我会创建一个唯一的约束,而不是一个唯一的 index 。这样,您也可以在需要时使用INSERT ... ON CONFLICT
。
您可能不希望在代码中使用SELECT *
。首先,这意味着如果添加额外的列,您的代码可能会中断,但是如果仅获取您真正需要的列,则这也会提高性能,特别是如果某些数据在TOAST表中。