Mysql索引底層數據結構之B樹

Mysql索引底層數據結構(B樹)

一.什麼是B樹

        B - Trees是一種平衡的多叉樹,稱爲B樹(或B-樹、B_樹),也是數據結構中樹形結構的一種。

二.什麼是索引,爲什麼要用要索引

        索引是幫助Mysql高效獲取數據的排好序數據結構,用於快速找出在某個列中有一特定值的行。

        假如數據庫有一張表(user)他的字段有col1和col2,我們的表是在我們的磁盤上,如果語句寫成select * from user where col1 = 6; 他就會從第一行開始,把磁盤上每一行數據都讀取出來,直到查找到col1 = 6的數據,我們如果不進行任何輔助手段幫助查詢的話,那麼我們查找到這一行數據要進行6次的磁盤I/O。如果我們表的數據是百萬級別的,而且數據恰好位於表的底層呢?那要經過多少次的磁盤I/O,效率自然會非常低。 如果沒有加索引,查詢的數據時就很可能會進行全表掃描。

三.Mysql中索引用到的數據結構

        上節說到,索引是排好序的數據結構,那麼它用到了哪種數據結構?
        如果學過數據結構的朋友估計對二叉樹肯定不陌生,二叉樹雖然能夠解決查詢的次數問題,但二叉樹一個節點的容量只能存一個索引,查找一個位與整個樹底端的數據所用到的次數就會隨着整個樹的高度增加。那我們如果不想讓整個樹的高度變得不可控,就可以在橫向擴容,設置一個節點的容量,讓其能夠存儲多個索引,那麼就引出了B樹。
B - Trees:

  • 一個節點上存儲了多個索引元素
  • 節點中數據索引從左到右遞增排列
  • 葉節點的指針爲空

B - Trees

四.Mysql並不是完全使用了B樹

Mysql其實對B樹做了些改造,真正的Mysql底層實際上所用到的是B+樹(B + Trees)
B + Trees(B - Trees變種):

  • 非葉子節點不存儲data,只存儲索引
  • 葉子節點不存儲指針
  • 順序訪問指針,提高區間訪問性能

在這裏插入圖片描述

五.B + Trees插入過程

        第三節說到B樹是對二叉樹做了橫向上的擴容,會設置一個容量,那麼如果要將數據1,2,3,4,5,6,7依次放入最大容量爲3的B+樹中,它會怎樣進行插入。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
        經過上圖可以看出B+樹的插入是才橫向上做文章,一個節點最大容量爲3(不能大於等於3),當一個節點的數據容量爲3時,它會進行分裂,讓其不能大於等於3。
每個節點遞增葉子節點依次遞增

        他也符合二叉樹的特性,相鄰的兩個樹叉,右邊的子元素總是大於等於它的父元素,左邊的子元素總是小於它的父元素。
在這裏插入圖片描述

六.使用B+樹對數據查詢

        不知道大家有沒有注意到上圖中葉子節點包含我們的所有數據,其實葉子節點是有一種完整的索引元素。非葉子節點把一些中間的元素提取出來做冗餘,放到非葉子節點。

        類似一些折半查找,都會把處於中間的元素提取出來做冗餘,查找就會更快。

一般Mysql會把根節點的所有元素放在內存,不需要從磁盤上查找

比如:要查找的數據爲30,30從內存中定位(大於15,小於56),指針經過一次磁盤I/O定位到下一個節點,30繼續定位(大於20,小於49),指針進行第二次磁盤I/O定位到30所在節點,總共只進行了兩次磁盤I/O,那麼它的讀取速率是非常快的。
在這裏插入圖片描述

最後給大家推薦一個學習數據結構的網址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

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