GiST索引


一、GiST索引

  • 是一種平衡的、樹狀結構的訪問方法。它在系統中相當於一個模板,幾乎可以實現任意索引模式
  • 可以建立一種可擴展的索引結構,包括數據類型和查詢謂詞的擴展
  • GiST接口提供了一個高層的抽象,只要求訪問方法的實現者實現被訪問數據類型的語義,即可快速為新的數據類型開發索引方法

二、GiST索引組織結構

是一顆平衡樹,索引項形式為(p, ptr),p是搜索的謂詞。在葉子節點中,ptr為指向數據庫某元組的指針,在非葉子節點中,ptr為指向子樹節點的指針:

 

 

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

 

 

 三.Gist索引的實現

1.索引的創建

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

 

 

2.GiST索引的查詢

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

 

3、索引的刪除

  1. 從葉子節點找到需要刪除的索引項
  2. 從葉子節點回溯更新索引
  3. 若刪除索引后存在空節點,則刪除

四、GiST索引實例

1.數據類型和關鍵字數據結構

設索引的數據是二維多邊形,用最小外接矩形表示。關鍵字為(Xul, Yul, Xlr, Ylr),其中(Xul, Yul)為外接矩形的左上角,(Xlr, Ylr)為外接矩形的右下角

2.支持的操作(謂詞)

Contains(包含), Overlap(重疊), Equil(相等)

 

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

 

 

 

 五、postgresql中支持的創建GiST索引的數據類型

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM