注意B-樹就是B樹,-只是一個符號.
簡介
B/B+樹是為了磁盤或其它存儲設備而設計的一種平衡多路查找樹(相對於二叉,B樹每個內節點有多個分支),與紅黑樹相比,在相同的的節點的情況下,一顆B/B+樹的高度遠遠小於紅黑樹的高度(在下面B/B+樹的性能分析中會提到).B/B+樹上操作的時間通常由存取磁盤的時間和CPU計算時間這兩部分構成,而CPU的速度非常快,所以B樹的操作效率取決於訪問磁盤的次數,關鍵字總數相同的情況下B樹的高度越小,磁盤I/O所花的時間越少.
B樹中所有結點的孩子結點數的最大值稱為B樹的階,通常用m表示。
一棵m叉樹的性質如下:
樹中每個結點至多有m棵子樹(即至多含有m-1個關鍵字)
若根結點不是終端結點,則至少有兩棵子樹
除根結點以外的所有非葉子結點至少有[m/2](向上取整)棵子樹(即至少含有[m/2]-1個關鍵字)
所有非葉子結點的關鍵字:K[1], K[2], …, K[m-1];且K[i] < K[i+1];
非葉子結點的指針:P[1], P[2], …, P[m];其中P[1]指向關鍵字小於K[1]的子樹,P[m]指向關鍵字大於K[m-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;
所有葉子結點位於同一層;
這里只是一個簡單的B樹,在實際中B樹節點中關鍵字很多的.上面的圖中比如35節點,35代表一個key(索引),而小黑塊代表的是這個key所指向的內容在內存中實際的存儲位置.是一個指針。
B+樹
B+樹是應文件系統所需而產生的一種B樹的變形樹(文件的目錄一級一級索引,只有最底層的葉子節點(文件)保存數據.),非葉子節點只保存索引,不保存實際的數據,數據都保存在葉子節點中.這不就是文件系統文件的查找嗎?我們就舉個文件查找的例子:有3個文件夾,a,b,c, a包含b,b包含c,一個文件yang.c, a,b,c就是索引(存儲在非葉子節點), a,b,c只是要找到的yang.c的key,而實際的數據yang.c存儲在葉子節點上.
所有的非葉子節點都可以看成索引部分,這里就不詳細介紹了
但為什么數據庫大部分都采用B樹呢?
當數據量很大的時候,磁盤的I/O速度是遠遠比不上內存的讀寫的。B-Tree的查詢效率好像也並不比平衡二叉樹高,但查詢所經過的結點數量要少很多,也就意味着要少很多次的磁盤IO,這對
性能的提升是很大的。
操作系統從磁盤讀取數據到內存是以磁盤塊(block)為基本單位的,位於同一個磁盤塊中的數據會被一次性讀取出來,而不是需要什么取什么。即使只需要一個字節,磁盤也會從這個位置開始,順序向后讀取一定長度的數據放入內存。這樣做的理論依據是計算機科學中著名的局部性原理: 當一個數據被用到時,其附近的數據也通常會馬上被使用。對於B樹來講,一個結點包含多個數據,比如從磁盤讀取時讀取一個結點的信息,包含多個數據中有就有目標數據,就不用再次進行IO讀取了
附一篇mysql索引更詳細的講解
https://blog.csdn.net/weixin_42181824/article/details/82261988