數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現通常使用B_TREE。B_TREE索引加速了數據訪問,因為存儲引擎不會再去掃描整張表得到需要的數據;相反,它從根節點開始,根節點保存了子節點的指針,存儲引擎會根據指針快速尋找數據。
上圖顯示了一種索引方式。左邊是數據庫中的數據表,有col1和col2兩個字段,一共有15條記錄;右邊是以col2列為索引列的B_TREE索引,每個節點包含索引的鍵值和對應數據表地址的指針,這樣就可以都過B_TREE在O(logn)的時間復雜度內獲取相應的數據,這樣明顯地加快了檢索的速度。
==============================================================================================================================
B_TREE(來源於數據結構,做個收藏)
1、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個孩子結點。
圖 一棵4階B_TREE
2、B_TREE的查找
在B_TREE上查找x,現將x的關鍵字與根結點的n個關鍵字di逐個比較,然后做如下處理:
- 若x.key==di,則查找成功返回;
- 若x.key<d1,則沿着指針c0所指的子樹繼續查找;
- 若di<x.key<d(i+1),則沿着指針ci所指的子樹繼續查找;
- 若x.key>dn,則沿着指針cn所指的子樹繼續查找。
3、B_TREE的插入
將元素x插入到B_TREE的過程為:
- 查找到x應該插入的結點(插入結點一定是葉結點);
- 判斷該結點是否還有空位置,即判斷該結點是否滿足結點關鍵字的個數n小於m-1這個條件。若n<m-1,則說明該結點還有空位置,直接把數據插入(注意插入時要滿足B_TREE結點結構定義);若n=m-1,則需要分裂該結點,即以中間關鍵字為界(包括要插入的關鍵字)把結點分為兩個結點,並把中間元素向上插入到雙親結點,若雙親結點未滿,則把它插入到雙親結點合適的位置,否則,繼續往上分裂(直到根結點分裂可能會有樹的高度增1的可能)。
4、B_TREE的刪除
定義要刪除結點x的關鍵字的個數為n,l=(int)m/2;
- 查找x是否存在,若不存在,則返回;若存在,則繼續;
- 對於葉結點上的刪除,分為3種情況:1、n>l則直接刪除該數據元素;2、n=l且該結點左(右)兄弟結點關鍵字個數大於l,把刪除數據元素結點的左(右)兄弟結點中最大(小)的元素上移到雙親結點上,同時把雙親結點中大於(小於)上移關鍵字的關鍵字下移到要刪除數據元素的結點上;3、n=l且該結點左(右)兄弟結點關鍵字個數等於l,把要刪除數據元素的結點的左(右)兄弟結點以及雙親結點上分割二者的數據元素合並成一個結點;
- 對於非葉結點的刪除,可以轉換為葉結點上的刪除:假設要刪除的元素為di,首先尋找要刪除數據元素的結點的ci所指向子樹中的最小關鍵字,設為d(min),然后把k(min)復制到ki,最后刪除關鍵字為k(min)的元素(此時的k(min)必為某個葉結點上的元素)。