Mysql存儲結構

索引是一種加快查詢速度的數據結構,經常使用索引結構有hash、B-Tree和B+Tree。本節經過分析三者的數據結構來講明爲啥Mysql選擇用B+Tree數據結構。mysql

數據結構

Hash

hash是基於哈希表完成索引存儲,哈希表特性是數據存放是散列的。算法

優勢:sql

等值查詢快,經過hash值直接定位到具體的數據。數據結構

缺點:性能

  1. 範圍查詢效率低(表中的數據是無序數據,在平常開發中一般須要範圍查詢,該狀況下hash須要一個一個查找後合併返回)
  2. hash表在使用的時會將全部數據加載到內存,比較消耗內存
  3. hash算法很差會出現hash碰撞的狀況
  4. 哈希索引只包含哈希值和行指針,而不存儲字段值,索引不能使用索引中的值來避免讀取行
  5. 哈希索引不支持部分列匹配查找,哈希索引是使用索引列的所有內容來計算哈希值

B-Tree

B-Tree特色:優化

  1. 全部鍵值數據分佈在整棵樹各個節點中
  2. 搜索有可能在非節點結束,在關鍵字全集內查找,相似二分查找
  3. 全部葉子節點都在同一層,而且以升序排列

B+Tree

B+Tree 是在B-Tree的基礎之上作的一種優化,變化以下:3d

  1. B+Tree 非葉子節點不存放數據
  2. 葉子節點存儲關鍵字和數據,非葉子節點的關鍵字也會沉到葉子節點,而且排序
  3. 葉子節點兩兩指針相互鏈接,造成一個雙向環形鏈表(符合磁盤的預讀特性),順序查詢性能更高

Mysql爲何選擇B+Tree

Mysql官網文檔中寫到InnoDB索引用的是 B-tree,可是底層用的是B+Tree。Mysql存儲數據是以頁爲單位,默認一個頁能夠存放16K數據。假設B-Tree和B+Tree都是3層深度,表中每一個記錄爲1K(假設的,通常不會這麼大,別較真),那麼三層深度的B-Tree存儲 16 x 16 x 16 = 4096(比這個數還要少,由於每一個頁中還要存放指針和其它的數據)。B+Tree第1、二層存放的是key,假設是Long類型的主鍵,那麼第1、二層每頁存放數據約爲 16 x 1024 / 8 = 2048,三層深度能夠存放 2048 x 2048 x 16 = 6700W。MySQL查詢過程是按頁加載數據的,每加載一頁就是一次IO操做,B+Tree進行三次IO能夠查詢6700W數據量。從這裏也能夠知道Mysql通常設置三層深度就足夠了。指針

相關文章
相關標籤/搜索