质疑

2017-08-04 103 views
0

我有一个表,看起来像一个多列索引的列(X,Z)(X,Y,Z):质疑

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)

回答

1

在这种情况下,主键上的现有索引应该足够了,因为PRIMARY KEY (x, y, z)实质上有Covering Index。请参阅What is a Covered Index?

1

对于查询,主键索引为足够。但是,它不是最佳

为了让Postgres使用索引,它需要扫描索引中的所有条目,其中x = ?为了找到z的匹配值。这可能是足够好的表现。

但是,对于查询的最佳指标是(x, z, y),因为这有效地覆盖了查询满足where条款。下一个最佳索引是(x, z),因为它涵盖了where子句。现有的主键索引将部分用于where子句(假设表中的统计信息表明应该使用索引)。