質疑

2017-08-04 139 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子句(假設表中的統計信息表明應該使用索引)。