支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

11.2. 索引類型 #

PostgreSQL 提供了幾種索引類型:B-tree、Hash、GiST、SP-GiST、GIN、BRIN,以及擴充功能 bloom。 每種索引類型使用不同的演算法,該演算法最適合不同類型的可索引子句。 預設情況下,CREATE INDEX 指令會建立 B-tree 索引,這適合最常見的情況。 其他索引類型是透過撰寫關鍵字 USING 後面接著索引類型名稱來選取的。 例如,要建立 Hash 索引

CREATE INDEX name ON table USING HASH (column);

11.2.1. B-Tree #

B-tree 可以處理可以排序成某種順序的資料上的相等性和範圍查詢。 特別是,每當索引欄位涉及使用以下運算子之一進行比較時,PostgreSQL 查詢規劃器將考慮使用 B-tree 索引

<   <=   =   >=   >

與這些運算子組合等效的構造(例如 BETWEENIN)也可以使用 B-tree 索引搜尋來實現。 此外,索引欄位上的 IS NULLIS NOT NULL 條件可以與 B-tree 索引一起使用。

最佳化器也可以將 B-tree 索引用於涉及模式比對運算子 LIKE~ 的查詢 如果 模式是常數且錨定到字串的開頭 - 例如,col LIKE 'foo%'col ~ '^foo',但不是 col LIKE '%bar'。 但是,如果您的資料庫未使用 C 地區設定,則需要使用特殊的運算子類別建立索引,以支援模式比對查詢的索引;請參閱下面的第 11.10 節。 也可以使用 B-tree 索引來實現 ILIKE~*,但前提是模式以非字母字元開頭,即不受大小寫轉換影響的字元。

B-tree 索引也可以用於以排序順序檢索資料。 這並不總是比簡單的掃描和排序更快,但通常很有用。

11.2.2. Hash #

Hash 索引儲存從索引欄位的值派生的 32 位元雜湊碼。 因此,此類索引只能處理簡單的相等性比較。 每當索引欄位涉及使用等於運算子進行比較時,查詢規劃器將考慮使用雜湊索引

=

11.2.3. GiST #

GiST 索引不是單一種類的索引,而是一個基礎結構,可以在其中實作許多不同的索引策略。 因此,可以使用 GiST 索引的特定運算子會根據索引策略(運算子類別)而有所不同。 例如,PostgreSQL 的標準發行版包含幾個二維幾何資料類型的 GiST 運算子類別,這些類別支援使用這些運算子進行索引查詢

<<   &<   &>   >>   <<|   &<|   |&>   |>>   @>   <@   ~=   &&

(請參閱 第 9.11 節,了解這些運算子的含義。)標準發行版中包含的 GiST 運算子類別記錄在 表 64.1 中。 許多其他 GiST 運算子類別可在 contrib 集合中或作為單獨的專案提供。 如需更多資訊,請參閱 第 64.2 節

GiST 索引也能够最佳化 最近鄰 搜尋,例如

SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;

找到最靠近給定目標點的十個位置。 這樣做的能力再次取決於所使用的特定運算子類別。 在 表 64.1 中,可以這種方式使用的運算子列在 排序運算子 欄中。

11.2.4. SP-GiST #

與 GiST 索引類似,SP-GiST 索引提供了一個基礎結構,支援各種搜尋。 SP-GiST 允許實作各種不同的非平衡基於磁碟的資料結構,例如四元樹、k-d 樹和基數樹(嘗試)。 例如,PostgreSQL 的標準發行版包含二維點的 SP-GiST 運算子類別,這些類別支援使用這些運算子進行索引查詢

<<   >>   ~=   <@   <<|   |>>

(請參閱 第 9.11 節,了解這些運算子的含義。)標準發行版中包含的 SP-GiST 運算子類別記錄在 表 64.2 中。 如需更多資訊,請參閱 第 64.3 節

如同 GiST,SP-GiST 支援最近鄰搜尋。對於支援距離排序的 SP-GiST 運算子類別,對應的運算子會列在排序運算子欄位中,請參考表 64.2

11.2.5. GIN #

GIN 索引是反向索引,適用於包含多個組成值 (component values) 的資料值,例如陣列。反向索引包含每個組成值的個別條目 (entry),並且可以有效地處理測試特定組成值是否存在的查詢。

如同 GiST 和 SP-GiST,GIN 可以支援許多不同的使用者定義索引策略,而 GIN 索引可以使用的特定運算子取決於索引策略。舉例來說,PostgreSQL 的標準發行版本包含用於陣列的 GIN 運算子類別,該類別支援使用以下運算子的索引查詢:

<@   @>   =   &&

(關於這些運算子的意義,請參考第 9.19 節)。標準發行版本中包含的 GIN 運算子類別記錄在表 64.3中。許多其他的 GIN 運算子類別可在 contrib 集合中或以獨立專案的形式取得。更多資訊請參考第 64.4 節

11.2.6. BRIN #

BRIN 索引 (Block Range INdexes 的簡稱) 儲存關於儲存在資料表連續實體區塊範圍中的值的摘要 (summaries)。因此,對於其值與資料表列的實體順序良好相關的欄位,它們是最有效的。如同 GiST、SP-GiST 和 GIN,BRIN 可以支援許多不同的索引策略,而 BRIN 索引可以使用的特定運算子取決於索引策略。對於具有線性排序順序的資料類型,索引資料對應於每個區塊範圍中欄位值的最小值和最大值。這支援使用以下運算子的索引查詢:

<   <=   =   >=   >

標準發行版本中包含的 BRIN 運算子類別記錄在表 64.4中。更多資訊請參考第 64.5 節

提交更正

如果您在文件中發現任何不正確、與您特定功能的使用經驗不符,或需要進一步澄清之處,請使用此表格回報文件問題。