本篇把索引的討論從已涵蓋的 B-tree 延伸到其他存取方法。作者會先說明界定「索引系統核心、索引存取方法、資料型別」三者邊界的可擴充性原則(並由此帶出運算子類別的概念),再逐一深入各個可用的方法。

本篇涵蓋#

  • Hash——磁碟上的雜湊表:頁面佈局(metapage/bucket/overflow/bitmap)、桶的動態分裂,以及它為何只支援等值搜尋。
  • B-tree——最通用也最常用的索引:樹狀結構、搜尋與插入、多欄位索引與 NULL 的處理,以及各項屬性。
  • GiST——廣義搜尋樹:一套可插入不同「一致性/union/penalty」邏輯的平衡樹框架,用於 R-tree、RD-tree、最近鄰搜尋等。
  • SP-GiST——空間分割樹:quadtree、k-D tree、radix tree 等非平衡結構的共同框架。
  • GIN——廣義倒排索引:為「一個值含多個元素」(全文檢索、陣列、JSON)而生,含待處理清單與 RUM 擴充。
  • BRIN——區塊範圍索引:不是為了快速定位列,而是為了濾掉不必要的區塊;為 TB 級大表設計,索引大小優先於搜尋精確度。

貫穿本篇的主線是可擴充性:索引引擎只負責通用的部分(取得 TID、檢查可見性、重新檢查條件),而**「什麼算相等」「什麼算包含」這類語意,全部外包給運算子類別**。理解這條邊界,才能理解為何 PostgreSQL 能在不改核心的情況下支援新的索引與新的資料型別。