MySQL之B樹和B+樹

首先拋個問題,MySQL的索引爲何用樹而不是其他數據結構如hash,hash的讀和寫都是O(1),而樹的話查詢和插入都是O(log(n))?
答:因爲索引設計成樹,是和SQL需求相關的,如果單獨只查詢某條數據,自然是hash算法快,但是我們平常用的查詢往往不是隻查詢單條數據,而是order by,group by,< >這種排序查詢,遇到這種情況,hash就會退化成O(n),而樹因爲它的有序性依然保持O(log(n))高效率。還有一個點是,如果索引的值有重複的話,會發生hash碰撞,導致查詢效率降低。
那爲何用的是B+樹呢?這就得比較B樹,B+樹與紅黑樹的區別了。

1.B+樹的非葉子節點只保存索引,不保存行記錄。而B樹葉子節點和非葉子節點都存儲索引和行記錄,這樣的話,同樣的空間,B+樹能存儲更多的索引。這就意味着同樣的數據,B+樹比B樹更”矮胖“,減少IO次數。
2.查詢的時候,由於B樹葉子節點和非葉子節點都存在行記錄,也就是是說,B樹查詢其實是不穩定的(好的時候,只查根節點,壞的時候,查到葉子節點)。而B+樹查詢最終必須到葉子節點,查詢銷量穩定。
3.B樹範圍查詢只能通過中序遍歷查詢來定位最小和最大值,而B+樹通過鏈表就能實現,查詢更方便。
綜合起來:B+樹比B樹優勢有三個:1.IO次數更少;2.查詢性能更穩定;3.範圍查詢簡便。
參考:https://blog.csdn.net/qq_26222859/article/details/80631121

InnoDB一棵B+樹可以存放多少行數據?這個問題的簡單回答是:約2千萬
那如何計算呢?首先我假設每行記錄爲1k,
首先假設樹高爲2,那麼根節點存儲的指針對應每個葉子節點。也就是說,最大的話,有多少個指針就有多少個葉子節點。
這棵B+樹存儲的總行數=根節點指針樹*每個葉子節點的行記錄樹
那麼根節點能存儲多少指針呢?
InnoDB最小單位爲頁,一頁爲16k,我們假設主鍵ID爲bigint類型,長度爲8字節,而指針大小在InnoDB源碼中設置爲6字節,這樣一共14字節,那麼一頁的總指針樹爲16k/(8+6) = 1170。
每個指針對應1頁,假設每行記錄爲1k(實際上現在很多互聯網業務數據記錄大小通常就是1K左右),那麼一頁大概能存16條行記錄。
所以這棵B+樹總行數爲:117016 = 18720
三層的話,總指針數爲1170
1170,故總行數爲1170* 1170*16=21902400
所以當單表數據超過千萬級別後,就得考慮分表了,否則B+樹的層級可能會超過3級,造成查詢效率下降。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章