索引是一種加快查詢速度的數據結構,經常使用索引結構有hash、B-Tree和B+Tree。本節經過分析三者的數據結構來講明爲啥Mysql選擇用B+Tree數據結構。mysql
hash是基於哈希表完成索引存儲,哈希表特性是數據存放是散列的。算法
優勢:sql
等值查詢快,經過hash值直接定位到具體的數據。數據結構
缺點:性能
B-Tree特色:優化
B+Tree 是在B-Tree的基礎之上作的一種優化,變化以下:3d
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通常設置三層深度就足夠了。指針