今天是2020年2月3號,畢了業以後的第一個「寒假」,我在院子裏曬太陽,閒來無事,寫篇博客html
這篇文章解決一個問題mysql
mysql 底層爲何是用b+樹做爲存儲結構?爲何不是二叉樹,紅黑樹,b樹?
咱們先構造一個應用場景,咱們有1kw的數據須要存儲在一張表裏面,那麼咱們怎麼設計能讓查詢速度儘量的快sql
咱們實驗的可視化的數據結構皆從如下網站獲取,地址:https://www.cs.usfca.edu/~gal...數據結構
ok,咱們先來看下二叉樹怎麼存儲這1kw數據,假設我有一張表,這張表裏只有一個字段,他是遞增的,看看用二叉樹是什麼情形性能
因而,咱們看到,在這種狀況下二叉樹直接退化成了一個鏈表,咱們若是要找到5這個記錄,須要查找5次,n條數據就要查找n次,複雜度O(n), 不知足咱們的需求網站
咱們再來看看紅黑樹spa
咱們看到紅黑樹有一個自平衡的特性,以犧牲插入性能解決了退化成鏈表的問題,但隨着記錄樹的增長,樹的高度會不斷增長,那麼,咱們想找到第1kw個數據,依然要查找不少次,對應到mysql上每次讀取一個樹的節點都須要進行一次io,那麼還有沒有更好的辦法呢?設計
ok,接下來看看b樹htm
能夠明顯看到的區別是,每個節點上存儲了多個數據,其實邏輯很簡單嘛,想保證高度固定,那就橫向上想辦法,這樣的話咱們查找16這條記錄,其實只須要通過3次io就能夠了blog
那b+樹和b樹又有什麼區別呢?引用網上的一張圖說明一下
具體到mysql上就是
因而,咱們就明白了,爲何mysql要用b+樹做爲底層數據結構,1kw的數據,索引應用合理,可能3次或者4次io就能夠定位到記錄了。