我的表格如下所示: -
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的选择查询。我想知道在两列上添加唯一约束是否足够,或者我是否也需要对它们进行索引。我已经对此进行了大量搜索,但没有说清楚。
答案 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)
如果您要经常从双方进行查询,则单独对列进行索引是更好的选择。