Bootstrap

[翻译] 关于学习 InnoDB:InnoDB 核心之旅

本系列文章翻译自 中的 文章 。共 16 篇,本文为第 1 篇。原文链接:

因翻译水平有限,为了避免对读者造成误解,一些专有名词的翻译会在其后用标记出原文。

关于学习 InnoDB:InnoDB 核心之旅

我已经使用 大约十年了,到目前为止,我已经很好地理解了它,大多数时候我可以用它实现我想做的事情。然而,为了达到一些与效率相关的目标,我发现有必要将自己的理解提升到一个新的水平。但不幸的是, 的文档中缺乏对 内部数据结构的清晰解释。事实证明,阅读源代码才是找到所需信息的唯一途径。

然而,我很快发现 的内部结构和它们的用法(尤其是它们之间的相互关系)太复杂了,仅凭阅读代码是无法完全理解的。不过还是希望你能仅仅基于阅读代码就正确理解了这些结构,这也是有可能的(至少对我来说,阅读代码过程中有很多误解)。

长期以来我一直采用一种方法来理解一些复杂但又缺乏文档的内容,它包括以下三个步骤:

实现 InnoDB 的磁盘数据结构

我开始了 项目,在这个项目中我使用 语言实现了 的磁盘数据结构。我选择 是因为它非常灵活,对于原型开发来说非常快速,而且它是我目前最喜欢的语言。其实任何语言也都可以实现,而且性能并不是我们真正关心的问题(尽管我们不希望它过于缓慢,否则的话会使测试变得非常烦人)。

在刚开始这个项目时,我在几分钟内完成了对 页面的 结构的解析(是一个 中所有类型的页面都通用的一个结构)。几个小时后,我实现了对 类型页面头部[]的解析,并且能够回答一些非常基本的问题,比如每个 类型页面中有多少条记录 ——— 这是一个即时且有用的结果。

我又根据需要依次实现了其他关键的数据结构,这其中每个数据结构都能够让我们更深入地理解 的存储的每个层次。这时候 Davi 也加入了这个项目,完成了一些比较棘手的部分,比如处理记录中可变宽度的字段类型。

现在我们基本上有了一个 主要数据结构的只读实现。

为 InnoDB 的磁盘数据结构绘制图表

当我发现了 足够多的秘密,我觉得我可以开始制作图表而不会出现比较严重的错误,所以我开始着手为所有主要的 磁盘数据结构构建清晰易懂的图表。为此我开始了 项目,并选择在 中构建这些图表。

截止目前,对于磁盘存储格式为 格式(记录格式为 )的表空间文件,大部分图表已经完成了。而 格式(记录格式为 )的表空间文件和 压缩表相关的图表还有许多需要补充。日志文件格式的相关的图表同样也是。

使用代码和图表

现在我们已经有了可用于演示的代码,以及可以作为很好的补充材料的图表,我打算写几篇文章来描述一些更有趣但缺少文档的数据结构。敬请期待!