爲何mysql索引選擇b+樹做爲底層存儲結構?

今天是2020年2月3號,畢了業以後的第一個「寒假」,我在院子裏曬太陽,閒來無事,寫篇博客html

這篇文章解決一個問題mysql

mysql 底層爲何是用b+樹做爲存儲結構?爲何不是二叉樹,紅黑樹,b樹?

咱們先構造一個應用場景,咱們有1kw的數據須要存儲在一張表裏面,那麼咱們怎麼設計能讓查詢速度儘量的快sql

咱們實驗的可視化的數據結構皆從如下網站獲取,地址:https://www.cs.usfca.edu/~gal...
image.png數據結構

ok,咱們先來看下二叉樹怎麼存儲這1kw數據,假設我有一張表,這張表裏只有一個字段,他是遞增的,看看用二叉樹是什麼情形性能

b_in.2020-02-03 13_00_50.gif

因而,咱們看到,在這種狀況下二叉樹直接退化成了一個鏈表,咱們若是要找到5這個記錄,須要查找5次,n條數據就要查找n次,複雜度O(n), 不知足咱們的需求網站

咱們再來看看紅黑樹spa

WX20200203-132708@2x.png

咱們看到紅黑樹有一個自平衡的特性,以犧牲插入性能解決了退化成鏈表的問題,但隨着記錄樹的增長,樹的高度會不斷增長,那麼,咱們想找到第1kw個數據,依然要查找不少次,對應到mysql上每次讀取一個樹的節點都須要進行一次io,那麼還有沒有更好的辦法呢?設計

ok,接下來看看b樹htm

WX20200203-133550@2x.png

能夠明顯看到的區別是,每個節點上存儲了多個數據,其實邏輯很簡單嘛,想保證高度固定,那就橫向上想辦法,這樣的話咱們查找16這條記錄,其實只須要通過3次io就能夠了blog

b_find.2020-02-03 13_40_12.gif

那b+樹和b樹又有什麼區別呢?引用網上的一張圖說明一下

image.png

具體到mysql上就是

  1. 有冗餘索引,方便查找
  2. 只在葉子節點上存儲數據,16k(mysql innodb_page_size的默認大小)的內存能夠存下更多數據,下降高度,查詢更快
  3. 葉子節點增長了雙向鏈表,方便範圍查詢

因而,咱們就明白了,爲何mysql要用b+樹做爲底層數據結構,1kw的數據,索引應用合理,可能3次或者4次io就能夠定位到記錄了。

相關文章
相關標籤/搜索