postgresql 对多个列的Unique约束是否可以分别为这些列添加索引

wn9m85ua  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(2)|浏览(130)

我有一个结构如下所示的表:

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.我想知道是否添加两列上的唯一约束是足够的,或者我需要做索引,以及对他们两个.我已经搜索了很多关于这一点,但没有什么使它清楚.

wqsoz72f

wqsoz72f1#

如果必须强制两列的唯一组合,则必须在它们上创建唯一索引。
如果你的where子句只在索引的第一列有一个条件,Postgres也会使用这个索引(通常的“它取决于”索引的使用仍然适用于这里)。
对于where条件,Postgres可以使用不是索引的前导列的列-但是,这比使用前导列效率低。
我会把那个列放在第一位,它经常被用作单个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上的条件和使用两列的(相等)条件。
无关,但是:
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);

au9on6nz

au9on6nz2#

如果您要从两端进行频繁的查询,那么分别对这两个列进行索引是一个更好的主意。
添加唯一约束是主观的-如果userid只喜欢videoid一次,那么它是有意义的,但是,由于唯一约束,这会对性能产生额外的影响。

相关问题