MySQL - MySQL索引實現原理:數據結構 + 算法原理


總結

必讀!!!原文鏈接:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

  1. 數據結構選擇:MySQL普遍使用帶“順序訪問指針”的B+Tree實現其索引結構。
  2. 數據結構選擇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會更低,時間更短。
  3. 非聚集索引 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 兩者有區別

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM