總結
必讀!!!原文鏈接:http://blog.codinglabs.org/articles/theory-of-mysql-index.html
- 數據結構選擇:MySQL普遍使用帶“順序訪問指針”的B+Tree實現其索引結構。
- 數據結構選擇B+樹的原因:磁盤IO次數少 + 磁盤IO時間短
- 磁盤IO次數少:索引一般以文件形式存儲在磁盤上,因此使用磁盤I/O次數就成為評價索引結構的優劣點。檢索B+/-樹中的某個值,最多需要訪問h個節點(h是樹的高度)。由於B+/-樹的一個節點包含更多的值,h不會很大 (相比於二叉樹,一個節點只有一個值。當“值”的總數一致時,二叉樹的高度h會更大,需要更多次IO)。
- 磁盤IO時間短:磁盤IO時間 = 尋道時間(耗時) + 旋轉時間(很快)。 MySQL設計者給B+/-樹申請一個新節點時,直接申請一個頁的空間(不必尋道,只有短暫的旋轉時間),保證了每個節點只需要一次I/O就可以完全載入。注意:頁是內存的最小存儲單位,常見為4K;扇區是磁盤的最小存儲單位,常見為512Byte。這里說的一個頁的空間,應該是指4K空間。
- 特別的,B+比B-更適合。因為B+樹內節點(非葉子節點)沒有data域,所以有更多的空間存儲指向下一級的指針,也就是說樹的高度h會更低,時間更短。
- 非聚集索引 vs 聚集索引
- MyISAM 是非聚集索引:索引和數據分開,索引只保存了數據記錄的地址。Primary Key(主鍵/主索引)和Secondary Key(輔助索引)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復。
- InnoDB 是聚集索引: 索引和數據在一起,Primary Key(主鍵/主索引)的葉節點直接包含數據記錄,Secondary Key(輔助索引)保存的是Primary Key的值。因此如果用Secondary Key(輔助索引)需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。
1. MySQL索引的數據結構
MySQL就普遍使用1.3 的結構 - 帶“順序訪問指針”的B+Tree實現其索引結構
1.1 B-Tree
1.2 B+Tree
1.3 帶有順序訪問指針的B+Tree
如圖4所示,在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指針,就形成了帶有順序訪問指針的B+Tree。做這個優化的目的是為了提高區間訪問的性能,例如圖4中如果要查詢key為從18到49的所有數據記錄,當找到18后,只需順着節點和指針順序遍歷就可以一次性訪問到所有數據節點,極大提到了區間查詢效率。
2. Primary Key和Secondary Key的區別
2.1 MyISAM 兩者沒有區別
2.2 InnoDB 兩者有區別