1. 程式人生 > >資料庫索引的實現原理以及優缺點

資料庫索引的實現原理以及優缺點

資料庫索引,在資料庫管理系統中是一個排序形式的資料結構,以協助快速查詢和更新資料庫表中資料。索引的實現通常使用B樹及其變種B+樹。

那麼為什麼要用B+樹來實現索引而不使用二叉搜尋樹或者平衡樹或者紅黑樹呢?要知道原因首先需要了解B樹的性質:

一個 m 階的B樹滿足以下條件:

  1. 每個結點至多擁有m棵子樹;
  2. 根結點如果是非空節點則至少擁有兩顆子樹;
  3. 除了根結點以外,其餘每個分支結點至少擁有 m/2 棵子樹;
  4. 所有的葉結點都在同一層上;
  5. 有 k 棵子樹的分支結點則存在 k-1 個關鍵碼,關鍵碼按照遞增次序進行排列;

B+樹在B樹的基礎上做了改進:

1. B+樹中只有葉子節點會帶有指向記錄的指標(ROWID),而B樹則所有節點都帶有,在內部節點出現的索引項不會再出現在葉子節點中。

2. B+樹中所有葉子節點都是通過指標連線在一起,而B樹不會。

B+樹的優點:

       1. 非葉子節點不會帶上ROWID,這樣,一個塊中可以容納更多的索引項,一是可以降低樹的高度。二是一個內部節點可以定位更多的葉子節點。

       2. 葉子節點之間通過指標來連線,範圍掃描將十分簡單,而對於B樹來說,則需要在葉子節點和內部節點不停的往返移動。

    一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟I/O消耗,相對於記憶體存取,I/O存取的消耗要高几個數量級,所以評價一個數據結構作為索引的優劣最重要的指標就是在查詢過程中磁碟I/O操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數。一般而言B+樹的每個節點都需要作業系統中的一頁來進行儲存,那麼我們在查詢使用到索引的時候最多進行的IO次數為訪問節點的個數,而在一課搜尋樹上進行搜尋時最多訪問的節點個數為樹的高度,到這裡我們就可以明白索引為什麼使用B+樹來實現了,B+樹中的每個節點可以儲存更多的記錄,因此樹的高度很低,從而查詢效率很高。

為表設定索引也是要付出相應的代價:第一,資料庫的儲存空間增大了;第二,在插入和修改資料時要花費較多的時間(因為索引也要隨之變動)。

建立索引可以大大提高系統的效能。

         通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

          可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。

          可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。

          在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

          通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

  增加索引也有許多不利的方面。

       建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

       索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

      當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。