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 中。
假设我有以下 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 中。