原文地址:https://blog.jcole.us/2013/01/02/on-learning-innodb-a-journey-to-the-core/,本系列翻译会在其基础上扩展一些 MySQL 源码相关的一些注释和思路解读,以及配图

我已经使用 InnoDB 大约十年了,我已经足够了解它并且可以用它做我想做的大部分事情。然而,为了实现一些更加高效的解决方案,我发现我需要更加深入理解它的原理与思想。不幸的是,InnoDB 文档对 InnoDB 的内部数据结构缺乏清晰明确的解释,阅读它的源码是深入了解其原理的唯一方法。

然而,在阅读源码的过程中我很快发现代码内部结构与联系非常复杂,导致我仅仅阅读代码很难理清其中的联系。希望正在阅读这篇文章的你能够通过仅仅阅读代码就能理清(对于我个人来说,在这个过程中我产生了很多误解)

我很久以来一直采取的一种方法来理解一些复杂且文档贫乏的东西,它包括以下三个步骤:

  1. 阅读现有文档和现有代码,直到达成基本理解为止。在这一步中,经常会出现严重的误解或不正确的拆解。
  2. 编写我自己的实现,即使是一个非常基本和简陋的实现。最好是用完全不同的语言编写(这样就避免了剪切和粘贴这种偷懒的倾向)根据什么有作用和什么不起作用来修改代码,并修正我的理解。
  3. 根据我的新理解总结新的文档和图表。根据需要重构我的实现(在总结文档的时候,会回顾代码,这经常会发现当时实现的问题并优化原有设计)。基于重构的代码,改正文档。重复这个过程直到正确。

InnoDB 磁盘数据结构的实现

我开启了 innodb_ruby 这个项目用 Ruby 来实现 InnoDB 磁盘数据结构。我之所以选择Ruby,是因为它非常灵活,用于原型开发非常快速,而且它是我目前最喜欢的语言。其实任何语言都可以,性能也不是问题(尽管我们不希望它成为问题,因为这会让测试变得烦人)

项目启动后,我在几分钟之内实现了非常基础的 FIL 头解析(所有的 InnoDB 页类型的这部分都是一样的)。然后又用了几个小时,实现了 INDEX 页头部并且可以回答一些非常基本的问题,例如在每一索引页有多少记录,这还是比较有用的。

按照我想更深入了解 InnoDB 存储的顺序,我继续实现了我所需要的每一个关键数据结构,Davi 也参与其中编写了一些细节的实现,比如处理记录中的可变宽度字段类型。

我们现在已经基本实现了 InnoDB 主要数据结构的只读实现。

记录InnoDB的磁盘数据结构

当我解开了足够多的 InnoDB 的秘密之后,我觉得我可以开始画一些比较准确的图片来更好的展示 InnoDB 存储的原理,于是我开始为所有主要的 InnoDB 磁盘数据结构建立清晰易懂的图表。我开启了 innodb_diagrams 这个项目,并且选用了 OmniGraffle 这个绘图软件。(555~能否照顾下我们这些用不起 MacBook 的人呀)

这是,文档中的表空间文件的大部分磁盘存储格式(ibdataX 和 *.ibd 文件)都是基于 Barracuda 行格式的存储(COMPACT 行格式的记录)。对于 Antelope 行格式(REDUNDANT 行格式的记录)还有大部分文档需要补充。日志文件目前也是需要补充文档。

使用代码以及图表

目前我们已经有实现交互展示的代码,以及可以成为很好的辅助资料的图片,我打算继续写几篇关于一些更有趣但是还没有文档的文章。请持续关注吧~~

J. Cole 的 InnoDB 系列 - 1. 学习 InnoDB - 深入探索核心原理之旅的更多相关文章

  1. EF5+MVC4系列(9) Razor视图引擎的核心原理;@符号的使用;输出html的转义

    一:Razor视图引擎的核心原理 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项 ,他是一个视图引擎 他的核心原理,就是当读取到 @符号的时候,就认为这是开始 ...

  2. mysql 从5.1升级到5.5.33 后 innodb 表出错 及 innodb表修复

    服务器使用的是mysql 5.1,了解到 5.5 系列的版本 innodb 的性能有很大提升,就想升级下.按照查到的步骤: http://www.myhack58.com/Article/sort09 ...

  3. 14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制:

    14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制: MySQL 复制工作对于InnoDB 表和对于MyISAM表. 它是可能使用复制的方式 存储引 ...

  4. 【Xamarin挖墙脚系列:学习资料大放送】

    原文:[Xamarin挖墙脚系列:学习资料大放送] 最靠谱的还是官方的文档,英文的,借着翻译工具,硬看吧.还能学习英文........... https://developer.xamarin.com ...

  5. 14.6.7 Configuring the Number of Background InnoDB IO Threads 配置InnoDB IO Threads的数量

    14.6.7 Configuring the Number of Background InnoDB IO Threads 配置InnoDB IO Threads的数量 InnoDB 使用后台线程来服 ...

  6. 14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering

    14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering 当插入,更新,和删除操作在表上执行, 索引列的值(特别是 se ...

  7. 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例

    14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...

  8. 14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering

    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering 当INSERT,UPDATE,和删除操作在表上操作, 索引列的 ...

  9. Innodb 实现高并发、redo/undo MVCC原理

    一.并发控制   因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全.   可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...

随机推荐

  1. php 配置主机虚拟目录(使用虚拟域名访问 127.0.0.1) 一点也不好使?????

    php 配置主机虚拟目录(使用虚拟域名访问 127.0.0.1)steps:1>打开目录  D:\xwamp\bin\apache\apache2.4.9\conf     修改文件 httpd ...

  2. UTC 时间转换 All In One

    UTC 时间转换 All In One http://www.timebie.com/cn/stduniversal.php UTC 时间 世界的每个地区都有自己的本地时间,在 Internet 及无 ...

  3. 如何使用 js 写一个正常人看不懂的无聊代码

    如何使用 js 写一个正常人看不懂的无聊代码 代码质量, 代码可读性, 代码可维护性, clean code WAT js WTF https://www.destroyallsoftware.com ...

  4. what's the print number means after called the setTimeout function in Chrome console?

    what's the print number means after called the setTimeout function in Chrome console? javascript fun ...

  5. js replace all & replaceAll

    js replace all & replaceAll https://scotch.io/tutorials/javascript-replace-all-instances-of-a-st ...

  6. Flutter 可选择的Text

    Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, ...

  7. 统一数据管理工具 —— CloudQuery v1.3.3 上线!

    前言 岁末临近,让我们跟随着新春的脚步,一起去看看 CloudQuery 今年最后一次更新吧! 新增功能 一.Oracle - 查看表结构 Oracle 数据源中,可查看各表结构信息(列详情和表注释等 ...

  8. clipse中mybatis的xml配置文件代码提示

    编写mybatis的xml文件时,没有代码提示会很麻烦,是有解决办法的: 按下图打开 点击右上角的Add按钮,添加配置,配置如下,添加后点击OK: Location:http://mybatis.or ...

  9. git相关问题

    1.git查看远程分支更新到本地 git clone 项目地址,示例如下: git clone https://github.com/zhongyushi-git/vue-test.git 在拉取时, ...

  10. Django的视图层和模板层

    目录 一.视图层 1. 小白必会三板斧 2. JsonResponse 3. FBV与CBV 3.1 FVB 3.2 CBV 4. CBV的源码 5. 给CBV加装饰器 二.模板层 1. 模板语法 2 ...