一、GiST索引
- 是一種平衡的、樹狀結構的訪問方法。它在系統中相當於一個模板,幾乎可以實現任意索引模式
- 可以建立一種可擴展的索引結構,包括數據類型和查詢謂詞的擴展
- GiST接口提供了一個高層的抽象,只要求訪問方法的實現者實現被訪問數據類型的語義,即可快速為新的數據類型開發索引方法
二、GiST索引組織結構
是一顆平衡樹,索引項形式為(p, ptr),p是搜索的謂詞。在葉子節點中,ptr為指向數據庫某元組的指針,在非葉子節點中,ptr為指向子樹節點的指針:

Gist內置實現了索引項查詢、插入和刪除的算法。用戶通過定義索引項並提供與索引項管理相關的方法,便可實現某一特定的索引結構,這些方法包括:

三.Gist索引的實現
1.索引的創建
由函數gistbuild函數完成。創建過程中,索引元組的插入在函數gistdoinsert中完成,實現過程是從根節點開始遍歷,找到插入代價最小(由Penalty方法實現)的葉子節點進行插入。若葉子節點已滿,插入新索引項會導致葉子節點的分裂,分裂時將調用PickSplit方法來決定新老節點中索引項的布局。向上更新謂詞時,會調用Union方法來確定父節點相應索引項的描述謂詞:

2.GiST索引的查詢
- 查詢流程與B-Tree索引類似, 從根節點開始按深度優先原則自上而下檢索:
- 若當前節點R是內部節點,檢查R上每個索引項E是否與檢索謂詞q相符合,對於滿足Consistent(E, q)的索引項,遞歸向下檢索以E.ptr為根的子樹
- 若當前節點R是葉子節點,檢查R上每個索引項E是否與檢索謂詞q相符合,對於滿足Consistent(E, q)的索引項,則通過E.ptr取得相應記錄與q進行准確匹配。將匹配成功的記錄放入結果集
- 索引查詢主要通過gistnext實現,該函數從上往下搜索索引結構。掃描過程中會生成一個棧結構,用於包存掃描過程中滿足Consistent方法的節點

3、索引的刪除
- 從葉子節點找到需要刪除的索引項
- 從葉子節點回溯更新索引
- 若刪除索引后存在空節點,則刪除
四、GiST索引實例
1.數據類型和關鍵字數據結構
設索引的數據是二維多邊形,用最小外接矩形表示。關鍵字為(Xul, Yul, Xlr, Ylr),其中(Xul, Yul)為外接矩形的左上角,(Xlr, Ylr)為外接矩形的右下角
2.支持的操作(謂詞)
Contains(包含), Overlap(重疊), Equil(相等)

3.基於上面的謂詞,實現下面的方法


五、postgresql中支持的創建GiST索引的數據類型
比如box(矩形), polygon(多邊形),circle(圓形)等,這些類型可以直接創建Gist索引。其他數據類型如果需要創建Gist索引,需要用戶手動添加(將需要的信息編譯進數據庫)
