Postgres 中 table 的最佳索引

Best indexes for table in Postgres

假设我有以下 table

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= ORDER BY col_b;

SELECT * FROM tbl WHERE col_a= AND col_b=;

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

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

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

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

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