1. 程式人生 > 其它 >MySQL索引:B+樹索引

MySQL索引:B+樹索引

MySQL索引:B+樹索引

B+樹索引是傳統意義上的索引,這是目前關係型資料庫系統中查詢最為常用和最為有效的索引。B+樹索引的構造類似於二叉樹,根據鍵值快速找到資料

B樹

B+樹是由B樹演化而來的,在瞭解B+樹之前,我們需要對B樹有一點認知。
B樹全稱Balance-tree(平衡多路查詢樹)定義如下:

  1. 樹中每個結點至多有m 棵子樹(注:m指的是樹的階);
  2. 若根結點不是葉子結點,則至少有兩棵子樹(注:根節點至少有兩個兒子);
  3. 除根結點之外的所有非葉子結點至少有p個子節點([m/2]≤p≤m,[m/2]為向上取整。);
  4. 所有的非葉子結點中包含以下資料:(n,A0,K1,A1,K2,…,Kn,An)
    其中:
    Ki(i=1,2,…,n)為關鍵碼,且Ki<Ki+1(注:ki是真實資料,存放線上性表當中,且從左至右升序排列)
    Ai 為指向兒子的指標(i=0,1,…,n),且指標Ai-1 所指子樹中所有結點的關鍵碼均小於Ki (i=1,2,…,n),An 所指子樹中所有結點的 關鍵碼均大於Kn。(注:每個ki資料兩旁各安放了一個指標,即Ai-1和Ai,左邊的子樹資料統統小於ki,右邊子樹的資料統 統大於ki)(注:總體來看指標數量比資料數量多1)
    n 為關鍵碼的個數([m/2]-1≤n≤m-1)。
  5. 所有的葉子結點都出現在同一層次上,即所有葉節點具有相同的深度,等於樹高度。並且不帶資訊(可以看作是外部結點或查詢失敗的結點,實際上這些結點不存在,指向這些結點的指標為空)。

B+樹

B+樹是為磁碟或者其他直接存取輔助裝置設計的一種平衡查詢樹。在B+樹中,所有記錄節點都是按鍵值的大小順序存放在同一層的葉子節點上,由各葉子節點指標進行連線。
B樹每個節點都儲存資料,所有節點組成這棵樹。B+樹只有葉子節點儲存資料(B+數中有兩個頭指標:一個指向根節點,另一個指向關鍵字最小的葉節點),葉子節點包含了這棵樹的所有資料,所有的葉子結點使用連結串列相連,便於區間查詢和遍歷,所有非葉節點起到索引作用。

B樹中葉節點包含的關鍵字和其他節點包含的關鍵字是不重複的,B+樹的索引項只包含對應子樹的最大關鍵字和指向該子樹的指標,不含有該關鍵字對應記錄的儲存地址。

B樹中每個節點(非根節點)關鍵字個數的範圍為m/2(向上取整)-1,m-1,並且具有n個關鍵字的節點包含(n+1)棵子樹。B+樹中每個節點(非根節點)關鍵字個數的範圍為m/2(向上取整),m,具有n個關鍵字的節點包含(n)棵子樹。

B+樹中查詢,無論查詢是否成功,每次都是一條從根節點到葉節點的路徑。
一顆高度為2的B+樹

B+樹的插入

B+樹的刪除

B+樹索引

聚集索引:

聚集索引是按照每張表的主鍵構造的一顆B+樹,同時葉子節點中存放的即為整張表的行為記錄資料,也將聚集縮影的葉子節點成為資料頁。
由於實際的資料頁只能按照一顆B+數進行排序,因此每張表只能擁有一個聚集索引。此外,由於定義了資料的邏輯順序,聚集索引能特別快的訪問針對範圍值的查詢。

輔助索引

在輔助索引中,葉子節點不包含行記錄的全部資料。葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含了一個書籤(bookMark)。概述前用來告訴InnoDB儲存引擎哪裡可以找到與索引相對應的行資料
輔助索引的存在並不影響資料在聚集索引中的組織,因此每張表尚客優有多個輔助索引