Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres中表的最佳索引_Postgresql_Indexing_Database Performance_Unique Constraint - Fatal编程技术网

Postgresql Postgres中表的最佳索引

Postgresql Postgres中表的最佳索引,postgresql,indexing,database-performance,unique-constraint,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) ); 我希望它在(colu_a,colu_b)上是唯一的,所以我还将创建以下索引 CREATE UNIQUE INDEX tbl_unique_idx ON tbl USING btree (col

假设我有下表

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)
);
我希望它在(colu_a,colu_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;
基本上,我们会一直在colu_a上过滤,帖子能在这里利用tbl_unique_idx吗? 我们也总是在colu_b上进行排序或筛选(除了在col_a上进行筛选),因此它可以利用相同的索引,还是需要自己的索引


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

您创建的索引将完美地满足您的两个查询。这是无法改进的

不过,我会创建一个唯一的约束,而不是唯一的索引。这样,您也可以使用
INSERT。。。如果需要,请使用冲突


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

谢谢,这就是我想知道的。我假设一个唯一的索引也允许
INSERT。。。关于冲突
,但我很乐意使用唯一约束。当然,我不会实际使用
SELECT*
,我同意这通常不是最佳实践。