PostgreSQL中复合主键的所有列是否需单独创建索引?
关于PostgreSQL复合主键与单独索引的问题
不需要单独给ID列创建索引,但是否需要给TYPE列单独建索引,取决于你的查询场景:
PostgreSQL在创建复合主键
(ID,TYPE)时,会自动生成一个同顺序的复合B-tree索引。这个索引完全支持以ID为条件的查询(比如WHERE ID = '123'),因为B-tree索引的前缀列可以被单独用来匹配,所以单独给ID建索引纯属冗余,只会浪费存储空间和增加写入时的索引维护开销。如果你的业务中有大量仅以
TYPE为条件的查询(比如WHERE TYPE = 'novel'),那这个复合索引就派不上用场了——因为TYPE是复合索引的非前缀列,无法单独被高效匹配。这种情况下,你需要给TYPE单独创建一个索引。反之,如果没有这类查询,就没必要多此一举。
举个例子,以下查询能用到自动生成的复合主键索引:
SELECT * FROM BOOK_TYPE WHERE ID = 'b001'; SELECT * FROM BOOK_TYPE WHERE ID = 'b001' AND TYPE = 'history';
而这个查询用不上复合索引,若频繁执行则需要单独建TYPE的索引:
SELECT * FROM BOOK_TYPE WHERE TYPE = 'comic';
内容的提问来源于stack exchange,提问作者Patan
相关产品推荐
相关产品推荐

