多个列上的唯一约束可以在这些列上单独添加索引

时间:2018-02-01 06:44:13

标签: sql postgresql

我的表格如下所示: -

CREATE TABLE IF NOT EXISTS tblvideolikes (
  itemid SERIAL PRIMARY KEY,
  videoid integer NOT NULL,
  userid integer NOT NULL,
  CONSTRAINT liked_video_user UNIQUE(videoid,userid)
)

我有很多用userid和videoid的选择查询。我想知道在两列上添加唯一约束是否足够,或者我是否也需要对它们进行索引。我已经对此进行了大量搜索,但没有说清楚。

2 个答案:

答案 0 :(得分:1)

如果必须强制执行两列的唯一组合,则必须在两个列上创建唯一索引。

如果你的where子句在索引的第一列只有条件(通常"它取决于"索引使用仍然适用于此处),Postgres也将使用该索引。 / p>

Postgres能够使用不是where条件的索引的前导列的列 - 但是使用前导列的效率较低。

我会首先将该列放在单个where条件下使用。列的顺序与唯一性无关。

如果使用(仅)第二列与使用(仅)第一列一样频繁,那么添加仅包含第二列的附加索引可能有意义,例如:

CREATE TABLE IF NOT EXISTS videolikes (
  itemid SERIAL PRIMARY KEY,
  videoid integer NOT NULL,
  userid integer NOT NULL,
  CONSTRAINT liked_video_user UNIQUE(videoid,userid)
);

create index on videolikes (userid);

然后,使用两列,唯一索引将仅用于videoid和(相等)条件的条件。第二个索引仅用于userid

的条件

无关,但是:

itemid主键在上述设置中几乎没用。您不必要地增加表的大小并添加另一个需要维护的索引。您可以简单地将其保留,并将videoid, userid声明为主键:

CREATE TABLE IF NOT EXISTS videolikes (
  videoid integer NOT NULL,
  userid integer NOT NULL,
  CONSTRAINT pk_videolikes primary key (videoid,userid)
);

create index on videolikes (userid);

答案 1 :(得分:-1)

如果您要经常从双方进行查询,则单独对列进行索引是更好的选择。