写点什么

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

用户头像
keaper
关注
发布于: 1 小时前
[翻译] 关于学习 InnoDB:InnoDB 核心之旅

本系列文章翻译自 Jeremy Cole's Blog 中的 InnoDB系列 文章 。共 16 篇,本文为第 1 篇。原文链接:On learning InnoDB: A journey to the core


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

关于学习 InnoDB:InnoDB 核心之旅

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


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


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


  1. 阅读现有的文档和现有的代码,直到达到基本的理解。在这个过程中经常会出现严重错误的 理解或分析。

  2. 编写我自己的实现,即使是一个非常基本的、不完整的实现,最好使用完全不同的语言(这样可以避免复制粘贴)。根据哪些有效,哪些无效来修正我的理解。

  3. 根据新的理解创建新的文档和图表。根据需要重构我的代码实现(为了编写文档回顾所有的内容经常能够发现错误的分析),根据对重构代码新的理解编写正确的文档。重复这个过程直到一切正确。

实现 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 压缩表相关的图表还有许多需要补充。日志文件格式的相关的图表同样也是。

使用代码和图表

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

发布于: 1 小时前阅读数: 4
用户头像

keaper

关注

还未添加个人签名 2018.01.19 加入

还未添加个人简介

评论

发布
暂无评论
[翻译] 关于学习 InnoDB:InnoDB 核心之旅