查询多列索引(x,y,z)的列(x,z)

时间:2017-08-04 09:53:45

标签: sql database postgresql

我有一张表格如下:

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)

2 个答案:

答案 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子句(假设表中的统计信息表明应该使用索引)。