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

原文地址:https://blog.jcole.us/2013/01/02/on-learning-innodb-a-journey-to-the-core/,本系列翻譯會在其基礎上擴展一些 MySQL 源碼相關的一些註釋和思路解讀,以及配圖

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

然而,在閱讀源碼的過程中我很快發現代碼內部結構與聯繫非常複雜,導致我僅僅閱讀代碼很難理清其中的聯繫。希望正在閱讀這篇文章的你能夠通過僅僅閱讀代碼就能理清(對於我個人來說,在這個過程中我產生了很多誤解)

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

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

InnoDB 磁盤數據結構的實現

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

項目啓動後,我在幾分鐘之內實現了非常基礎的 FIL 頭解析(所有的 InnoDB 頁類型的這部分都是一樣的)。然後又用了幾個小時,實現了 INDEX 頁頭部並且可以回答一些非常基本的問題,例如在每一索引頁有多少記錄,這還是比較有用的。

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

我們現在已經基本實現了 InnoDB 主要數據結構的只讀實現。

記錄InnoDB的磁盤數據結構

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

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

使用代碼以及圖表

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章