我已经使用innoDB大约十年了,到目前为止,我对他的理解已经足够好,可以在大多数时候让他为我做我任何想做的事情。然而,为了达到一些与效率相关的目标,我发现我有必要把我的理解提升到一个新的层次。不幸的是,innoDB缺乏对其内部数据结构的清晰解释,阅读源代码是找到我需要新的唯一办法。 然而,我很快发现这些结构和他们的用法(特别是他们之间的相互关系)太过复杂。仅凭阅读代码根本无法记住他们,此外,仅仅基于阅读,希望你已经正确地理解了数据结构。(对我而言,这个过程会有很多误解)。 长期以来,我一直采用以下三个步骤来理解一些复杂且缺乏文档的东西:
我启动了innodb_ruby项目,在ruby中实现了InnoDB的磁盘数据结构,我选择Rubu是因为它非常灵活,对于原型涉及来说速度非常快,而且他是我目前最喜欢的语言。但是,任何语言都是可行的。而且性能并不是真正的问题,尽管我们不希望它太慢,因为那样会使得迭代测试变得很麻烦。 项目开始后,我在几分钟内对16KB页文件上的FIL标题进行了非常基本的解析。(对InnoDB中所有类型的页都很常见)。几个小时之后,我实现了索引的页标提,并且可以回答一些非常基本的问题,比如每个索引页中有多少条记录,这是一个立即有用的结果。 我接着实现了我需要的每一个关键的数据结构,并且按照我需要的顺序,每一个都能在不同的层次上更深的理解InnoDB的存储。Davi也加入进来,写了一些复杂的代码,比如处理激励中的可变宽度字段类型。 我们现在有一个在InnoDB主要数据结构的只读实现。
一旦InnoDB的秘密被揭露,我觉得喔可以开始制作图标而不会完全出错,我开始为所有的主要的InnoDB磁盘上的数据结构构建清晰易懂的图标。我开始了inno_diagrams项目,并选择在OminiGraffile中构建他们。 此时,大多数表空间的文件的磁盘上存储格式ibdataX和*.ibd文件。是Barracuda格式的文档,带有紧凑的记录。要为Antelope格式(带有冗余记录)和innodb压缩表构建相应的文档,还有很多工作要做。日志文件格式也保留下来。
现在我们已经有了可以用于交互演示的工作代码,以及可以作为很好的支持材料的图标,我打算写一些关于一些更有趣但是没有文档说明的结构的文章。注意了。