Mysql之數據結構

1.Hash

哈希表是鍵值對的集合,通過鍵(key)值即可快速的取出對應的值(value),因此hash表查詢的速度很快。但是,哈希算法有hash衝突的問題,也就是說多個不同的key最後得到的index相同,雖然hash通過鏈表的方法解決了hash衝突,但是如果使用hash用來存儲數據,mysql可能會將每一行數據都存儲在hash表中,這樣數據都會通過hash表來維護,如果數據庫操作數據量特別龐大,添加數據的時候會增加hash衝突次數。這是原因之一。
還有一個原因是因爲hash不支持順序查找,假如我們要對錶中的數據進行排序和範圍搜索,hash實現起來會很麻煩。雖然這種數據結構查詢快,但是沒有數據大小的概念,所以這種數據結構僅能滿足 “=”,“IN”,範圍查詢會導致全表掃描,所以也應用較少。
由於Mysql的B+Tree葉子節點有雙向指針,並且是順序排列的,就可以很好的支持範圍查找。

2.二叉樹

二叉樹的每一個節點都只有兩個子節點,當需要向其插入更多的數據的時候,就必須要增加樹的高度,而增加樹的高度會導致IO的次數變多,對於二叉樹而言,它的查找操作的時間複雜度就是樹的高度,樹的高度越高查詢性能會隨着數據的增多越來越低。
二叉樹節點中,右邊的節點一定會大於左邊的節點。如果是非正常的傾斜(比如id是自增的情況)的二叉樹,查詢一次數據就相當於與全表搜索。

二叉樹圖:

極端單邊增長的值在二叉樹中和鏈表:

3.紅黑樹

紅黑樹是一個二叉平衡樹。平衡樹在插入和刪除的時候,會通過旋轉操作將樹的左右節點達到平衡。紅黑樹的特性導致從根節點到葉子節點的最長路徑不會超過最短路徑的2倍。在實際場景應用當中,MySQL表數據,一般情況下都是比較龐大、海量的。如果使用紅黑樹,樹的高度會特別高,紅黑樹雖說查詢效率很高。但是在海量數據的情況下,樹的高度並不可控,而且紅黑樹也需要不斷的調整平衡性,也需要消耗性能。如果我們要查詢的數據,正好在樹的葉子節點。那查詢會非常慢。

樹結構:

 4.B-Tree

B樹的葉子結點具有相同的深度。所有索引元素不重複,節點中的數據索引從左到右遞增排列。
那麼爲什麼不選擇B-tree呢?

B樹的索引節點既要存索引信息,又要存其對應的數據,每個節點一次I/O操作就可以完全載入,這樣能大大提高對數據讀取的效率。但是如果數據很大,那麼當樹的體量很大時,節點上的數據會超過磁盤塊大小範圍。但是B樹的高度是根據索引的大小決定的,比如一個葉子節點的大小是16Kb,一個索引元素按照1kb(比如一個表有二十個字段,每個字段都是bigint佔用8個字節,可以算出,一行數據應該不會超出1KB,這是一個預估值《按照平均1kb計算》),一個葉子節點只能存16個索引元素,如果要查找千萬級的數據,需要16 的N次方=一千萬才能查到數據,N就是查找的索引次數。

 5.B+Tree

B+Tree和B-Tree的差距在於B+Tree的分支節點只存儲索引信息,把數據都放在葉子節點上(非葉子節點是冗餘節點,取得是葉子節點在磁盤節點上某些部分的索引),而且葉子節點包含了書中所有的索引結構,從左到右有序的遞增的,這樣保證了相近的數據都能存在同一塊數據塊裏。葉子節點的每一頁都包含了上一頁和下一頁的內存地址的指針索引,因此B+樹具備了天然排序功能,在排序和範圍查找的時候更方便。

同時B+樹的查詢次數更穩定,每次查詢次數都是相同的,都需要查詢到葉子節點。比如:在mysql中B+Tree默認的磁盤頁節點大小是16KB,假設索引(主鍵索引)是bigint類型的,那麼他會佔8個字節,加上葉子結點的磁盤文件地址6個字節,節點索引大小大概是14tb,那麼每一個索引行(頁)就可以存儲1170個索引元素,加入第三行存的是葉子節點,因爲節點中包含所有數據信息(假設是整行數據,大小算1kb《比如一個表有二十個字段,每個字段都是bigint佔用8個字節,可以算出,一行數據應該不會超出1KB,這是一個預估值》),那麼b+tree樹只需要三行就可以存放1170×1170×16=21,902,400 個索引元素了。所以B+Tree只需要三次的磁盤io就可以找到需要查找的元素了。也就說千萬級的數據(走索引的情況)查找只需要經過三級就可以快速的查找到需要的元素了。

6.B-Tree和B+Tree

b+樹只需要三級既可以存儲千萬級別的數據索引了,而b-樹需要是根據索引的索引元素大小來構建索引節點的,數據量較大的時候,b+樹io次數更少。
b+樹只有的葉子纔會存儲數據,b-樹所有索引節點都會存儲數據。
b+樹所有查詢都要查找到葉子節點,查詢性能穩定。
b+樹所有葉子節點在這裏插入圖片描述
形成有序鏈表,便於範圍查詢。 

相關係列文章:

 0.Mysql之如何插入數據剖析mysql各個技術點 :通過插入一條數據的過程引出mysql知識點:

1.mysql之事務隔離級別以及MVCC:ACID、事務級別以及產生問題、MVCC(三個隱藏字段、undolog、read_view詳解)

2.Mysql之Innodb鎖場景:鎖分類、RC下各種加鎖情況、RR下各種加鎖情況

3.Mysql之主從複製原理:主從複製原理、二次提交、MTS、組提交、GTID

4.Mysql之數據結構 :hash、二叉樹、AVL、平衡二叉樹(紅黑樹)、B-Tree、B+Tree

5.Mysql之索引 :回表、索引覆蓋、索引下推、MRR、FIC、索引方式、哈希索引

6.Mysql之其他知識  :日誌、MyiSAM和InnoDB比較,基礎知識體系

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