淺談MYSQL的索引以及它的數據結構

什麼是索引

mysql的數據是持久化到磁盤的,寫SQL查詢數據也就是在磁盤的某個位置查找符合條件的數據,但是磁盤IO比起內存效率是極慢的,特別是數據量大的時候,這時候就需要引入索引來提高查詢效率;
在我看來索引是爲了提高查詢效率而誕生的一種手段,藉助合適的數據結構將數據有規律的沉澱下來,使得查詢的時候能儘量減少磁盤IO快速返回;也可以類比書本或字典的目錄,能快速定位數據

索引的類型

mysql的索引可分爲:主鍵索引(唯一且非空)、唯一索引(可爲空)、全文索引、聯合索引以及普通索引(普通列做索引)

索引的優點

  • 減少磁盤IO次數,提升查詢效率
  • 將隨機IO變成順序IO

索引的數據結構

衆所周知,mysql innerDb和myIsam引擎索引的數據結構都是B+樹,使用B+樹作爲索引的數據結構主要是因爲相同的磁盤IO次數下B+樹的查詢表現遠高於其他數據結構,並且B+樹的葉子節點是收尾相連的,這樣更便於順序查詢;下面依次簡單介紹下其他數據結構作爲索引數據結構的優缺點

HASH表

首先介紹下hash算法,通過hash算法將索引列分散到hash表上去,由於hash是基於內存的,所以效率還是不錯的,但是正是因爲基於內存導致了其不適合大數據量的計算,浪費內存空間;並且hash算法查詢時只有等值計算纔會體現他的高效,對於範圍查詢其還是無能爲力;需要注意的是,mysql的memory存儲引擎索引的數據結構就是hash表

二叉樹

二叉樹插入數據時很容易造成樹的傾斜,每次插入對應一次IO,效率低下

AVL樹

平衡樹在二叉樹的基礎上新增了左旋和右旋,但是需要確保最短子樹和最長字樹的高度差不大於1;當插入數據量過大時會進行很多次的旋轉,導致插入速度極低;查詢效率高

紅黑樹

紅黑樹相當於是AVL樹的一個升級,它通過變色的操作降低了左右旋轉的次數,中和了AVL樹插入速度慢的缺點;紅黑樹的要求如下:

  • 任意路徑上不能有兩個紅色節點連續出現
  • 最長子樹不超過最短子樹的兩倍即可
  • 更節點到各子節點的鏈路中黑色節點的數量一致
    雖說紅黑樹提高了插入效率,但是受限於一個節點最多隻有兩個子節點的影響,當數據量大時還是會出現樹深度過深從而增加IO次數的問題

B樹

B樹的每個節點可以有N個節點,這就解決了上面說的樹深度的問題,B樹的每個節點(包括非葉子節點)不僅會存儲頁碼而且還會存儲對應的數據;下面我們分析下B樹的查詢能力:
mysql是通過磁盤預讀來查詢數據的,每次可以讀取頁的整數倍,一頁等於4KB,inderDb默認讀的是16KB,我們假設一行數據佔用1KB的內存並且忽略節點上頁面佔用的空間,這樣三次磁盤IO的話B樹能讀出161616=4096條數據,效率並不是很理想,並不能滿足日常工作中的實際需求

B+樹

B+樹與B樹的區別在於,B+樹的非葉子節點不存儲數據,數據均存儲在葉子節點,且葉子節點收尾相連;我們同樣來計算下B+樹的查詢能力:
由於非葉子節點不存儲數據只存儲頁碼,假設一個頁碼佔用10個字節的內存,這樣一個磁盤塊可以容納的數據爲:(16 * 1000)/10=1600條,假設同樣進行三次IO,那麼能支持查詢的數據量是:1600 * 1600 * 16=40960000,輕鬆達到千萬級別;

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