J. Cole 的 InnoDB 系列 - 1. 學習 InnoDB - 深刻探索核心原理之旅

原文地址:blog.jcole.us/2013/01/02/… MySQL 源碼相關的一些註釋和思路解讀,以及配圖git

我已經使用 InnoDB 大約十年了,我已經足夠了解它而且能夠用它作我想作的大部分事情。然而,爲了實現一些更加高效的解決方案,我發現我須要更加深刻理解它的原理與思想。不幸的是,InnoDB 文檔對 InnoDB 的內部數據結構缺少清晰明確的解釋,閱讀它的源碼是深刻了解其原理的惟一方法。github

然而,在閱讀源碼的過程當中我很快發現代碼內部結構與聯繫很是複雜,致使我僅僅閱讀代碼很難理清其中的聯繫。但願正在閱讀這篇文章的你可以經過僅僅閱讀代碼就能理清(對於我我的來講,在這個過程當中我產生了不少誤解)ruby

我好久以來一直採起的一種方法來理解一些複雜且文檔貧乏的東西,它包括如下三個步驟:markdown

  1. 閱讀現有文檔和現有代碼,直到達成基本理解爲止。在這一步中,常常會出現嚴重的誤解或不正確的拆解。
  2. 編寫我本身的實現,即便是一個很是基本和簡陋的實現。最好是用徹底不一樣的語言編寫(這樣就避免了剪切和粘貼這種偷懶的傾向)根據什麼有做用和什麼不起做用來修改代碼,並修正個人理解。
  3. 根據個人新理解總結新的文檔和圖表。根據須要重構個人實現(在總結文檔的時候,會回顧代碼,這常常會發現當時實現的問題並優化原有設計)。基於重構的代碼,改正文檔。重複這個過程直到正確。

InnoDB 磁盤數據結構的實現

我開啓了 innodb_ruby 這個項目用 Ruby 來實現 InnoDB 磁盤數據結構。我之因此選擇Ruby,是由於它很是靈活,用於原型開發很是快速,並且它是我目前最喜歡的語言。其實任何語言均可以,性能也不是問題(儘管咱們不但願它成爲問題,由於這會讓測試變得煩人)數據結構

項目啓動後,我在幾分鐘以內實現了很是基礎的 FIL 頭解析(全部的 InnoDB 頁類型的這部分都是同樣的)。而後又用了幾個小時,實現了 INDEX 頁頭部而且能夠回答一些很是基本的問題,例如在每一索引頁有多少記錄,這仍是比較有用的。oop

按照我想更深刻了解 InnoDB 存儲的順序,我繼續實現了我所須要的每個關鍵數據結構,Davi 也參與其中編寫了一些細節的實現,好比處理記錄中的可變寬度字段類型。性能

咱們如今已經基本實現了 InnoDB 主要數據結構的只讀實現。測試

記錄InnoDB的磁盤數據結構

當我解開了足夠多的 InnoDB 的祕密以後,我以爲我能夠開始畫一些比較準確的圖片來更好的展現 InnoDB 存儲的原理,因而我開始爲全部主要的 InnoDB 磁盤數據結構創建清晰易懂的圖表。我開啓了 innodb_diagrams 這個項目,而且選用了 OmniGraffle 這個繪圖軟件。(555~可否照顧下咱們這些用不起 MacBook 的人呀)優化

這是,文檔中的表空間文件的大部分磁盤存儲格式(ibdataX 和 *.ibd 文件)都是基於 Barracuda 行格式的存儲(COMPACT 行格式的記錄)。對於 Antelope 行格式(REDUNDANT 行格式的記錄)還有大部分文檔須要補充。日誌文件目前也是須要補充文檔。spa

使用代碼以及圖表

目前咱們已經有實現交互展現的代碼,以及能夠成爲很好的輔助資料的圖片,我打算繼續寫幾篇關於一些更有趣可是尚未文檔的文章。請持續關注吧~~

相關文章
相關標籤/搜索