原文地址:blog.jcole.us/2013/01/02/… MySQL 源码相关的一些注释和思路解读,以及配图git
我已经使用 InnoDB 大约十年了,我已经足够了解它而且能够用它作我想作的大部分事情。然而,为了实现一些更加高效的解决方案,我发现我须要更加深刻理解它的原理与思想。不幸的是,InnoDB 文档对 InnoDB 的内部数据结构缺少清晰明确的解释,阅读它的源码是深刻了解其原理的惟一方法。github
然而,在阅读源码的过程当中我很快发现代码内部结构与联系很是复杂,致使我仅仅阅读代码很难理清其中的联系。但愿正在阅读这篇文章的你可以经过仅仅阅读代码就能理清(对于我我的来讲,在这个过程当中我产生了不少误解)ruby
我好久以来一直采起的一种方法来理解一些复杂且文档贫乏的东西,它包括如下三个步骤:markdown
我开启了 innodb_ruby
这个项目用 Ruby 来实现 InnoDB 磁盘数据结构。我之因此选择Ruby,是由于它很是灵活,用于原型开发很是快速,并且它是我目前最喜欢的语言。其实任何语言均可以,性能也不是问题(尽管咱们不但愿它成为问题,由于这会让测试变得烦人)数据结构
项目启动后,我在几分钟以内实现了很是基础的 FIL
头解析(全部的 InnoDB 页类型的这部分都是同样的)。而后又用了几个小时,实现了 INDEX
页头部而且能够回答一些很是基本的问题,例如在每一索引页有多少记录,这仍是比较有用的。oop
按照我想更深刻了解 InnoDB 存储的顺序,我继续实现了我所须要的每个关键数据结构,Davi 也参与其中编写了一些细节的实现,好比处理记录中的可变宽度字段类型。性能
咱们如今已经基本实现了 InnoDB 主要数据结构的只读实现。测试
当我解开了足够多的 InnoDB 的秘密以后,我以为我能够开始画一些比较准确的图片来更好的展现 InnoDB 存储的原理,因而我开始为全部主要的 InnoDB 磁盘数据结构创建清晰易懂的图表。我开启了 innodb_diagrams
这个项目,而且选用了 OmniGraffle 这个绘图软件。(555~可否照顾下咱们这些用不起 MacBook 的人呀)优化
这是,文档中的表空间文件的大部分磁盘存储格式(ibdataX 和 *.ibd 文件)都是基于 Barracuda 行格式的存储(COMPACT 行格式的记录)。对于 Antelope 行格式(REDUNDANT 行格式的记录)还有大部分文档须要补充。日志文件目前也是须要补充文档。spa
目前咱们已经有实现交互展现的代码,以及能够成为很好的辅助资料的图片,我打算继续写几篇关于一些更有趣可是尚未文档的文章。请持续关注吧~~