mysql2023sg138中原信用盤原始碼網站平臺搭建資料結構型別部署全過程

a7813715發表於2023-02-11

大家都知道SG138中原 信用盤原始碼網站平臺搭建資料結構是用b+tree實現的,作為mysql資料技術開發人員飛機TG【@cctvboy】另外一種方式ν_Χ"   code7813  我們可以用mysql的資料結構是用b+tree來實現的。為什麼不用其他資料結構呢?比如說hash、二叉樹、紅黑樹、b-tree。要了解mysql底層的資料結構實現,需要先了解一下各個資料結構的特點以及儲存方式:

Hash

雜湊表是鍵值對的集合,透過鍵(key)值即可快速的取出對應的值(value),因此hash表查詢的速度很快。但是,雜湊演算法有hash衝突的問題,也就是說多個不同的key最後得到的index相同,雖然hash透過連結串列的方法解決了hash衝突,但是如果使用hash用來儲存資料,mysql可能會將每一行資料都儲存在hash表中,這樣資料都會透過hash表來維護,如果資料庫運算元據量特別龐大,新增資料的時候會增加hash衝突次數。這是原因之一。

還有一個原因是因為hash不支援順序查詢,假如我們要對錶中的資料進行排序和範圍搜尋,hash實現起來會很麻煩。


二叉樹

二叉樹的每一個節點都只有兩個子節點,當需要向其插入更多的資料的時候,就必須要增加樹的高度,而增加樹的高度會導致IO的次數變多,對於二叉樹而言,它的查詢操作的時間複雜度就是樹的高度,樹的高度越高查詢效能會隨著資料的增多越來越低。

二叉樹節點中,右邊的節點一定會大於左邊的節點。如果是非正常的傾斜(比如id是自增的情況)的二叉樹,查詢一次資料就相當於與全表搜尋。


在這裡插入圖片描述


紅黑樹

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


b-tree

B樹的葉子結點具有相同的深度。所有索引元素不重複,節點中的資料索引從左到右遞增排列。

那麼為什麼不選擇B-tree呢?


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


在這裡插入圖片描述

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就可以找到需要查詢的元素了。也就說千萬級的資料(走索引的情況)查詢只需要經過三級就可以快速的查詢到需要的元素了。


在這裡插入圖片描述


b-tree和b+tree的區別

b+樹只需要三級既可以儲存千萬級別的資料索引了,而b-樹需要是根據索引的索引元素大小來構建索引節點的,資料量較大的時候,b+樹io次數更少。

b+樹只有的葉子才會儲存資料,b-樹所有索引節點都會儲存資料。

b+樹所有查詢都要查詢到葉子節點,查詢效能穩定。

b+樹所有葉子節點在這裡插入圖片描述

形成有序連結串列,便於範圍查詢。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026651/viewspace-2934866/,如需轉載,請註明出處,否則將追究法律責任。

相關文章