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

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`](https://github.com/jeremycole/innodb_ruby) 這個專案用 Ruby 來實現 InnoDB 磁碟資料結構。我之所以選擇Ruby,是因為它非常靈活,用於原型開發非常快速,而且它是我目前最喜歡的語言。其實任何語言都可以,效能也不是問題(儘管我們不希望它成為問題,因為這會讓測試變得煩人) 專案啟動後,我在幾分鐘之內實現了非常基礎的 `FIL` 頭解析(所有的 InnoDB 頁型別的這部分都是一樣的)。然後又用了幾個小時,實現了 `INDEX` 頁頭部並且可以回答一些非常基本的問題,例如在每一索引頁有多少記錄,這還是比較有用的。 按照我想更深入瞭解 InnoDB 儲存的順序,我繼續實現了我所需要的每一個關鍵資料結構,Davi 也參與其中編寫了一些細節的實現,比如處理記錄中的可變寬度欄位型別。 我們現在已經基本實現了 InnoDB 主要資料結構的只讀實現。 # 記錄InnoDB的磁碟資料結構 當我解開了足夠多的 InnoDB 的祕密之後,我覺得我可以開始畫一些比較準確的圖片來更好的展示 InnoDB 儲存的原理,於是我開始為所有主要的 InnoDB 磁碟資料結構建立清晰易懂的圖表。我開啟了 [`innodb_diagrams`](https://github.com/jeremycole/innodb_diagrams) 這個專案,並且選用了 OmniGraffle 這個繪圖軟體。(555~能否照顧下我們這些用不起 MacBook 的人呀) 這是,文件中的表空間檔案的大部分磁碟儲存格式(ibdataX 和 *.ibd 檔案)都是基於 Barracuda 行格式的儲存(COMPACT 行格式的記錄)。對於 Antelope 行格式(REDUNDANT 行格式的記錄)還有大部分文件需要補充。日誌檔案目前也是需要補充文件。 # 使用程式碼以及圖表 目前我們已經有實現互動展示的程式碼,以及可以成為很好的輔助資料的圖片,我打算繼續寫幾篇關於一些更有趣但是還沒有文件的文章。請持續關