目的數據庫
數據庫中很重要的設計一部分,莫過於索引了。B+樹索引是MySQL中設計的索引。B+樹索引是基於B+樹基礎發展而來的。併發
然而,在理解了B+樹索引結構之後,對優化SQL會事半功倍。還針對前面MySQL索引選擇規則文章作進一步分析。優化
1:B+樹與B+樹索引區別spa
B+樹 | B+樹索引 | |
存儲位置 | 內存 | 磁盤 |
扇出率 | 低 | 高 |
併發控制 | 能夠不考慮 | 須要考慮 |
分裂方向 | 不須要考慮 | 向左、向右 |
上圖中列出二者的區別,光看圖片可能不能理解每一個區別對應的含義。.net
下面就來分析一下重要的區別:設計
1.1:存儲位置:指針
B+樹是爲磁盤或其餘直接存取輔助設備而設計的一種平衡查找樹,所以主要操做是計算不須要文件來存儲,也就是在內存來操做的。orm
B+樹索引是基於磁盤,所以數據庫會出現索引文件,索引文件就是存儲在磁盤上的。blog
1.2:分裂方向索引
B+樹是內存結構,不須要考慮頁分裂的方向。
B+樹索引在磁盤上,爲了充分利用磁盤的順序特性,還須要根據不一樣插入狀況考慮不一樣的分裂點記錄以及分裂的方向。
2:MySQL的InnoDB存儲引擎的索引設計
InnoDB存儲引擎將B+樹索引分爲彙集索引和輔助索引。
彙集索引是經過將表的主鍵做爲鍵值來構造B+樹。若是沒有顯示建立,自動建立一個6字節的主鍵。彙集索引還包含記錄全部列信息。
2.1:存儲結構
彙集索引的非葉子點存放的是<鍵值, 地址>,地址爲指向下一層的指針。葉子點存放的是<記錄信息>。
輔助索引的非葉子點存放的是<鍵值,主鍵值, 地址>,葉子點存放的是<主鍵>。
2.2:查詢方式
MySQL經過輔助索引查詢數據時,只是查詢出主鍵值,再經過主鍵查詢彙集索引,最後肯定記錄信息。
2.3:記錄數量
一般輔助索引比彙集索引的高度要小。如記錄的長度爲100字節,輔助索引記錄的長度爲40字節,對比後的結果爲:
B+樹的高度 | 彙集索引 | 輔助索引 |
1 | 160(16K/100) | 500(16K/40) |
2 | 25600 | 250000 |
3 | 4096000 | 125000000 |
4 | 655360000 | 62500000000 |
一樣的高度下輔助索引能存放更多的記錄。
1:MySQL索引選擇規則(主鍵查詢)
students_origin表中只有主鍵,所以執行計劃使用主鍵查詢id信息。
studentns表中有多個索引。
查詢結果只有主鍵一個字段,再根據2.1來分析,主鍵其實存放在輔助索引裏面的。
根據2.3來分析,假如輔助索引"idx_rank"只有一個頁(MySQL最小單位)存儲了全部記錄數,輔助索引"idx_major"有兩個頁存儲了全部記錄數,輔助索引"idx_rank_total"有三個頁存儲了全部記錄數,彙集索引須要四個頁存儲了全部記錄數,若是每次IO只能讀取一個頁信息。"idx_rank"一次IO,"idx_major"兩次IO,"idx_rank_total"三次IO,彙集索引要四次IO。
結論,選擇最少那次IO的索引。