1. 程式人生 > >11索引與雜湊

11索引與雜湊

SQL索引

SQL建立索引

create index <index-name> on <relation-name>(<attribute-list>);
create unique index <index-name> on <relation-name>(<attribute-list>);

SQL刪除索引

drop index <index-name>;

  • 搜尋碼:在檔案中查詢記錄的屬性或屬性集
  • 複合搜尋碼:一個包含多個屬性的搜尋碼
  • 不唯一搜索碼:一個關係擁有多個包含同一搜尋碼值的搜尋碼

基本索引型別

順序索引:基於值的順序排序

- 聚集索引/主索引:包含記錄的檔案按搜尋碼指定順序排序
- 非聚集索引/輔助索引:搜尋碼指定的順序與檔案中記錄的順序不同的索引

稠密索引:每個搜尋碼值都有一個索引項。

- 稠密聚集索引中,索引項包括搜尋碼值以及指向該搜尋碼值的第一條資料記錄的指標
- 稠密非聚集索引中,索引項必須儲存指向所有具有相同搜尋碼值的記錄的指標列表
- 更快定位一條記錄

插入
  1. 如果搜尋碼值不在索引中,就在合適位置插入具有該搜尋碼值的索引項
  2. 否則
    1. 如果索引項儲存的是指標列表,就在索引項中增加一個指向新紀錄的指標
    2. 否則,索引項儲存一個僅指向具有相同搜尋碼值的第一條記錄的指標,系統把插入的記錄放到具有相同搜尋碼值的其他記錄之後
刪除
  1. 如果被刪除的記錄是具有這個特定搜尋碼值的唯一一條記錄,系統就從索引中刪除該索引項
  2. 否則
    1. 如果索引項儲存的是指標列表,系統從索引項中刪除指向被刪除記錄的指標
    2. 否則,索引項儲存的是指向具有該搜尋碼值的第一條記錄的指標。如果被刪除的記錄是具有該搜尋碼值的第一條記錄,系統就更新索引項,使其指向下一條記錄

稀疏索引:只為搜尋碼某些值建立索引項

- 只有索引是聚集索引可以用稀疏索引。每個索引項包括搜尋碼值以及指向該搜尋碼值的第一條資料記錄的指標
- 所佔空間小,插入、刪除維護開銷小

插入
  1. 如果系統建立一個新塊,就把新塊中出現的第一個搜尋碼值插入到索引中
  2. 否則
    1. 如果新插入的記錄含有塊中的最小搜尋碼值,系統就更新指向該塊的索引項
    2. 否則,不作改動
刪除
  1. 如果索引不包含具有被刪除記錄的搜尋碼值的索引項,索引不做修改
  2. 否則
    1. 如果被刪除的記錄是具有該搜尋碼值的唯一記錄,系統用下一個搜尋碼值的索引替換響應的索引記錄,如果下一個搜尋碼已經有一個索引項,就刪除該索引項
    2. 否則,如果該搜尋碼值的索引記錄指向被刪除的記錄,系統就更新索引項,使其指向具有相同搜尋碼值的下一條記錄

多級索引

  • 稀疏外層索引
  • B+樹
    • 採用平衡樹的結構,樹根到樹葉的每條路徑長度相同
    • n個指標P1,P2,…Pn,n-1個搜尋碼K1,K2,…,Kn-1。n和分割槽的塊大小有關,使每個節點能存在一個塊當中
    • 根節點
    • 如果根不是葉子,至少有2個孩子,可以小於⎡n/2⎤
    • 如果根是葉子,可以有0~n-1個值
    • 非葉節點
    • 至少容納⎡n/2⎤個指標,最多容納n個指標
    • P1指向小於K1的部分,Pm指向大於等於Km-1的部分
    • 葉節點
    • 至少有⎡(n-1./2⎤個值,最多有n-1個值

點陣圖索引

- 每個點陣圖都有和關係中記錄數相等數目的位
- 如果編號i的記錄在屬性A上的值為j,那麼值為j的點陣圖中第i位設定為1,否則為0
- 多碼索引時,執行多個位圖的交(邏輯與)

覆蓋索引

- 儲存一些屬性的值及指向記錄的指標
- 僅僅使用索引就可以回答一些查詢

雜湊索引:基於將值平均分佈到若干雜湊桶中

桶:能儲存一條或多條記錄的一個儲存單位,通常一個桶是一個磁碟塊
雜湊函式:從搜尋碼值集合對映到桶地址集合的函式。要求分佈時均勻的,隨機的
- 靜態雜湊
- 動態雜湊
- 可擴充雜湊
- 增加桶地址表

桶溢位

  • 原因
    • 桶不足
    • 偏斜
  • 解決
    • 閉地址
    • 桶數目選為(n/f)(1+d)n為記錄總數,f為一個桶能存放的記錄數目,d為避讓因子一般為0.2
    • 用溢位鏈連結溢位桶
    • 開地址
    • 將記錄插入其他桶中

順序索引和雜湊索引比較

  • 順序索引有利於隨機訪問,有利於值範圍內的查詢
  • 雜湊索引有利於根據關鍵字查詢