[翻译] 关于学习 InnoDB:InnoDB 核心之旅
本系列文章翻译自 Jeremy Cole's Blog 中的 InnoDB系列 文章 。共 16 篇,本文为第 1 篇。原文链接:On learning InnoDB: A journey to the core。
因翻译水平有限,为了避免对读者造成误解,一些专有名词的翻译会在其后用
[]
标记出原文。
关于学习 InnoDB:InnoDB 核心之旅
我已经使用 InnoDB
大约十年了,到目前为止,我已经很好地理解了它,大多数时候我可以用它实现我想做的事情。然而,为了达到一些与效率相关的目标,我发现有必要将自己的理解提升到一个新的水平。但不幸的是,InnoDB
的文档中缺乏对 InnoDB
内部数据结构的清晰解释。事实证明,阅读源代码才是找到所需信息的唯一途径。
然而,我很快发现 InnoDB
的内部结构和它们的用法(尤其是它们之间的相互关系)太复杂了,仅凭阅读代码是无法完全理解的。不过还是希望你能仅仅基于阅读代码就正确理解了这些结构,这也是有可能的(至少对我来说,阅读代码过程中有很多误解)。
长期以来我一直采用一种方法来理解一些复杂但又缺乏文档的内容,它包括以下三个步骤:
阅读现有的文档和现有的代码,直到达到基本的理解。在这个过程中经常会出现严重错误的 理解或分析。
编写我自己的实现,即使是一个非常基本的、不完整的实现,最好使用完全不同的语言(这样可以避免复制粘贴)。根据哪些有效,哪些无效来修正我的理解。
根据新的理解创建新的文档和图表。根据需要重构我的代码实现(为了编写文档回顾所有的内容经常能够发现错误的分析),根据对重构代码新的理解编写正确的文档。重复这个过程直到一切正确。
实现 InnoDB 的磁盘数据结构
我开始了 innodb_ruby 项目,在这个项目中我使用 Ruby
语言实现了 InnoDB
的磁盘数据结构。我选择 Ruby
是因为它非常灵活,对于原型开发来说非常快速,而且它是我目前最喜欢的语言。其实任何语言也都可以实现,而且性能并不是我们真正关心的问题(尽管我们不希望它过于缓慢,否则的话会使测试变得非常烦人)。
在刚开始这个项目时,我在几分钟内完成了对 16KB
页面的 FIL Header
结构的解析(FIL Header
是一个 InnoDB
中所有类型的页面都通用的一个结构)。几个小时后,我实现了对 INDEX
类型页面头部[header
]的解析,并且能够回答一些非常基本的问题,比如每个 INDEX
类型页面中有多少条记录 ——— 这是一个即时且有用的结果。
我又根据需要依次实现了其他关键的数据结构,这其中每个数据结构都能够让我们更深入地理解 InnoDB
的存储的每个层次。这时候 Davi 也加入了这个项目,完成了一些比较棘手的部分,比如处理记录中可变宽度的字段类型。
现在我们基本上有了一个 InnoDB
主要数据结构的只读实现。
为 InnoDB 的磁盘数据结构绘制图表
当我发现了 InnoDB
足够多的秘密,我觉得我可以开始制作图表而不会出现比较严重的错误,所以我开始着手为所有主要的 InnoDB
磁盘数据结构构建清晰易懂的图表。为此我开始了 innodb_diagrams 项目,并选择在 OmniGraffle
中构建这些图表。
截止目前,对于磁盘存储格式为 Barracuda
格式(记录格式为 COMPACT
)的表空间文件,大部分图表已经完成了。而 Antelope
格式(记录格式为 REDUNDANT
)的表空间文件和 InnoDB
压缩表相关的图表还有许多需要补充。日志文件格式的相关的图表同样也是。
使用代码和图表
现在我们已经有了可用于演示的代码,以及可以作为很好的补充材料的图表,我打算写几篇文章来描述一些更有趣但缺少文档的数据结构。敬请期待!
版权声明: 本文为 InfoQ 作者【keaper】的原创文章。
原文链接:【http://xie.infoq.cn/article/f083b52b09d21b92195f5b94e】。文章转载请联系作者。
评论