MySQL索引:B+樹索引
B+樹索引是傳統意義上的索引,這是目前關系型數據庫系統中查找最為常用和最為有效的索引。B+樹索引的構造類似於二叉樹,根據鍵值快速找到數據
B樹
B+樹是由B樹演化而來的,在了解B+樹之前,我們需要對B樹有一點認知。
B樹全稱Balance-tree(平衡多路查找樹)定義如下:
- 樹中每個結點至多有m 棵子樹(注:m指的是樹的階);
- 若根結點不是葉子結點,則至少有兩棵子樹(注:根節點至少有兩個兒子);
- 除根結點之外的所有非葉子結點至少有p個子節點([m/2]≤p≤m,[m/2]為向上取整。);
- 所有的非葉子結點中包含以下數據:(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)。 - 所有的葉子結點都出現在同一層次上,即所有葉節點具有相同的深度,等於樹高度。並且不帶信息(可以看作是外部結點或查找失敗的結點,實際上這些結點不存在,指向這些結點的指針為空)。
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存儲引擎哪里可以找到與索引相對應的行數據
輔助索引的存在並不影響數據在聚集索引中的組織,因此每張表尚客優有多個輔助索引