數據庫索引實現原理—B_TREE

     數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現一般使用B_TREE。B_TREE索引加速了數據訪問,由於存儲引擎不會再去掃描整張表獲得須要的數據;相反,它從根節點開始,根節點保存了子節點的指針,存儲引擎會根據指針快速尋找數據。數據庫

        上圖顯示了一種索引方式。左邊是數據庫中的數據表,有col1和col2兩個字段,一共有15條記錄;右邊是以col2列爲索引列的B_TREE索引,每一個節點包含索引的鍵值和對應數據表地址的指針,這樣就能夠都過B_TREE在O(logn)的時間複雜度內獲取相應的數據,這樣明顯地加快了檢索的速度。數據結構

 ==============================================================================================================================指針

B_TREE(來源於數據結構,作個收藏)blog

一、B_TREE的定義排序

    B_TREE是一種平衡多叉排序樹,是一種動態查找效率很高的樹形結構。B_TREE中全部結點的孩子結點的最大值稱爲B_TREE的階,B_TREE的階一般用m表示,簡稱爲m叉樹。通常來講,應該是m>=3。一顆m階的B_TREE或是一顆空樹,或者是知足下列條件的m叉樹:索引

  • 樹中每一個結點最多有m個孩子結點;
  • 除根結點外,其它結點至少有(int)m/2+1個孩子結點;
  • 若根結點不是葉子節點,則根結點至少有2個孩子結點;
  • 結點的結構:  其中,n爲結點中關鍵字個數,(int)m/2<=n<m;di(1<=i<=n)爲該結點的n個關鍵字值的第i個,且di<d(i+1);ci(0<=i<=n)爲該結點孩子結點的指針,且ci所指向的節點的關鍵字均大於或等於di且小於d(i+1);
  • 全部的葉結點都在同一層上。

 一棵4階B_TREE的示例。4叉樹結點的孩子結點的個數範圍[2,4]。其中,有2個結點有4個孩子結點,有1個結點有3個孩子結點,有5個結點有2個孩子結點。ci

 

 

圖 一棵4階B_TREE效率

二、B_TREE的查找im

在B_TREE上查找x,現將x的關鍵字與根結點的n個關鍵字di逐個比較,而後作以下處理:數據

  • 若x.key==di,則查找成功返回;
  • 若x.key<d1,則沿着指針c0所指的子樹繼續查找;
  • 若di<x.key<d(i+1),則沿着指針ci所指的子樹繼續查找;
  • 若x.key>dn,則沿着指針cn所指的子樹繼續查找。

三、B_TREE的插入

將元素x插入到B_TREE的過程爲:

  • 查找到x應該插入的結點(插入結點必定是葉結點);
  • 判斷該結點是否還有空位置,即判斷該結點是否知足結點關鍵字的個數n小於m-1這個條件。若n<m-1,則說明該結點還有空位置,直接把數據插入(注意插入時要知足B_TREE結點結構定義);若n=m-1,則須要分裂該結點,即以中間關鍵字爲界(包括要插入的關鍵字)把結點分爲兩個結點,並把中間元素向上插入到雙親結點,若雙親結點未滿,則把它插入到雙親結點合適的位置,不然,繼續往上分裂(直到根結點分裂可能會有樹的高度增1的可能)。

四、B_TREE的刪除

定義要刪除結點x的關鍵字的個數爲n,l=(int)m/2;

  • 查找x是否存在,若不存在,則返回;若存在,則繼續;
  • 對於葉結點上的刪除,分爲3種狀況:一、n>l則直接刪除該數據元素;二、n=l且該結點左(右)兄弟結點關鍵字個數大於l,把刪除數據元素結點的左(右)兄弟結點中最大(小)的元素上移到雙親結點上,同時把雙親結點中大於(小於)上移關鍵字的關鍵字下移到要刪除數據元素的結點上;三、n=l且該結點左(右)兄弟結點關鍵字個數等於l,把要刪除數據元素的結點的左(右)兄弟結點以及雙親結點上分割兩者的數據元素合併成一個結點;
  • 對於非葉結點的刪除,能夠轉換爲葉結點上的刪除:假設要刪除的元素爲di,首先尋找要刪除數據元素的結點的ci所指向子樹中的最小關鍵字,設爲d(min),而後把k(min)複製到ki,最後刪除關鍵字爲k(min)的元素(此時的k(min)必爲某個葉結點上的元素)。
相關文章
相關標籤/搜索