2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 索引一起使用。

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

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

11.2.2. Hash #

Hash 索引儲存從被索引列的值派生的 32 位雜湊碼。因此,此類索引只能處理簡單的相等性比較。當被索引列涉及等號運算子的比較時,查詢規劃器會考慮使用雜湊索引:

=

11.2.3. GiST #

GiST 索引本身並不是一種索引,而是一個基礎設施,可以在其中實現許多不同的索引策略。因此,GiST 索引可以使用的特定運算子取決於索引策略(運算子類)。例如,PostgreSQL 的標準發行版包含適用於幾種二維幾何資料型別的 GiST 運算子類,這些類支援使用以下運算子的索引查詢:

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

(這些運算子的含義請參閱 第 9.11 節。) 標準發行版中包含的 GiST 運算子類在 表 65.1 中有記錄。在 contrib 集合或作為獨立專案中有許多其他 GiST 運算子類可用。有關更多資訊,請參閱 第 65.2 節

GiST 索引還能夠最佳化最近鄰搜尋,例如:

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

該查詢查詢離給定目標點最近的十個地點。能夠執行此操作的能力再次取決於所使用的特定運算子類。在 表 65.1 中,可以這樣使用的運算子在“Ordering Operators”列中列出。

11.2.4. SP-GiST #

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

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

(這些運算子的含義請參閱 第 9.11 節。) 標準發行版中包含的 SP-GiST 運算子類在 表 65.2 中有記錄。有關更多資訊,請參閱 第 65.3 節

與 GiST 類似,SP-GiST 支援最近鄰搜尋。對於支援距離排序的 SP-GiST 運算子類,對應的運算子在 表 65.2 的“Ordering Operators”列中列出。

11.2.5. GIN #

GIN 索引是倒排索引,適合包含多個元件值(如陣列)的資料值。倒排索引為每個元件值包含一個單獨的條目,並且可以有效地處理測試特定元件值是否存在的查詢。

與 GiST 和 SP-GiST 類似,GIN 可以支援許多不同的使用者定義的索引策略,並且 GIN 索引可以使用的特定運算子取決於索引策略。例如,PostgreSQL 的標準發行版包含一個適用於陣列的 GIN 運算子類,該類支援使用以下運算子的索引查詢:

<@   @>   =   &&

(這些運算子的含義請參閱 第 9.19 節。) 標準發行版中包含的 GIN 運算子類在 表 65.3 中有記錄。在 contrib 集合或作為獨立專案中有許多其他 GIN 運算子類可用。有關更多資訊,請參閱 第 65.4 節

11.2.6. BRIN #

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

<   <=   =   >=   >

標準發行版中包含的 BRIN 運算子類在 表 65.4 中有記錄。有關更多資訊,請參閱 第 65.5 節

提交更正

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