我有一张表格如下:
CREATE TABLE t (
x some_type_1,
y some_type_2,
z some_type_3,
PRIMARY KEY (x, y, z)
);
现在我想有效地执行此查询:
SELECT * FROM t WHERE x = ? AND z = ?;
在这种情况下,(主键)索引(x, y, z)
是否足够,或者我应该创建单独的索引(x, z)
?
答案 0 :(得分:1)
在这种情况下,主键上的现有索引应该足够了,因为PRIMARY KEY (x, y, z)
你基本上拥有的是Covering Index
。见What is a Covered Index?
答案 1 :(得分:1)
查询的主键索引足够。但是,它不是最佳。
为了让Postgres使用索引,它需要扫描索引中x = ?
的所有条目,以便找到z
的匹配值。这可能是足够好的表现。
但是,查询的最佳索引是(x, z, y)
,因为这涵盖了查询和有效地满足where
子句。下一个最佳索引是(x, z)
,因为它涵盖了where
子句。现有的主键索引将部分用于where
子句(假设表中的统计信息表明应该使用索引)。