J. Cole 的 InnoDB 系列 - 1. 学习 InnoDB - 深入探索核心原理之旅
原文地址:https://blog.jcole.us/2013/01/02/on-learning-innodb-a-journey-to-the-core/,本系列翻译会在其基础上扩展一些 MySQL 源码相关的一些注释和思路解读,以及配图
我已经使用 InnoDB 大约十年了,我已经足够了解它并且可以用它做我想做的大部分事情。然而,为了实现一些更加高效的解决方案,我发现我需要更加深入理解它的原理与思想。不幸的是,InnoDB 文档对 InnoDB 的内部数据结构缺乏清晰明确的解释,阅读它的源码是深入了解其原理的唯一方法。
然而,在阅读源码的过程中我很快发现代码内部结构与联系非常复杂,导致我仅仅阅读代码很难理清其中的联系。希望正在阅读这篇文章的你能够通过仅仅阅读代码就能理清(对于我个人来说,在这个过程中我产生了很多误解)
我很久以来一直采取的一种方法来理解一些复杂且文档贫乏的东西,它包括以下三个步骤:
- 阅读现有文档和现有代码,直到达成基本理解为止。在这一步中,经常会出现严重的误解或不正确的拆解。
- 编写我自己的实现,即使是一个非常基本和简陋的实现。最好是用完全不同的语言编写(这样就避免了剪切和粘贴这种偷懒的倾向)根据什么有作用和什么不起作用来修改代码,并修正我的理解。
- 根据我的新理解总结新的文档和图表。根据需要重构我的实现(在总结文档的时候,会回顾代码,这经常会发现当时实现的问题并优化原有设计)。基于重构的代码,改正文档。重复这个过程直到正确。
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 - 深入探索核心原理之旅的更多相关文章
- EF5+MVC4系列(9) Razor视图引擎的核心原理;@符号的使用;输出html的转义
一:Razor视图引擎的核心原理 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项 ,他是一个视图引擎 他的核心原理,就是当读取到 @符号的时候,就认为这是开始 ...
- mysql 从5.1升级到5.5.33 后 innodb 表出错 及 innodb表修复
服务器使用的是mysql 5.1,了解到 5.5 系列的版本 innodb 的性能有很大提升,就想升级下.按照查到的步骤: http://www.myhack58.com/Article/sort09 ...
- 14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制:
14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制: MySQL 复制工作对于InnoDB 表和对于MyISAM表. 它是可能使用复制的方式 存储引 ...
- 【Xamarin挖墙脚系列:学习资料大放送】
原文:[Xamarin挖墙脚系列:学习资料大放送] 最靠谱的还是官方的文档,英文的,借着翻译工具,硬看吧.还能学习英文........... https://developer.xamarin.com ...
- 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 使用后台线程来服 ...
- 14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering 当插入,更新,和删除操作在表上执行, 索引列的值(特别是 se ...
- 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...
- 14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering 当INSERT,UPDATE,和删除操作在表上操作, 索引列的 ...
- Innodb 实现高并发、redo/undo MVCC原理
一.并发控制 因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全. 可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...
随机推荐
- JxBrowser: 6.6.1 Crack
JxBrowser: 6.6.1. 1. RELEASE NOTES Download:HomePage JxBrowser is a cross-platform library that prov ...
- 如何在没有显示器的情况下,查看 Raspberry Pi 3的 IP 信息(Raspberry Pi 3 ,IP Address)
1. 如何在没有显示器的情况下,查看 Raspberry Pi 3的 IP 信息(Raspberry Pi 3 ,IP Address) 1 IP Address Any device connect ...
- React Hooks: useRef All In One
React Hooks: useRef All In One useRef https://reactjs.org/docs/hooks-reference.html#useref refs xgqf ...
- Proxifier
Proxifier 使用教程 https://www.proxifier.com/ Proxifier允许不支持通过代理服务器工作的网络应用程序通过SOCKS或HTTPS代理和链进行操作. confi ...
- how to check website offline status in js
how to check website offline status in js https://developer.mozilla.org/en-US/docs/Web/API/Navigator ...
- 破除区块链支付壁垒,NGK支付架构方案浮出水面
什么叫做区块链支付?区块链支付系统与传统支付系统有哪些不同?简要地说,原来传统的支付系统是有一个类似于银行的中间平台存在的,用户们的支付交易第一时间是寄存在平台,由平台核实验证交易行为之后,方才放行交 ...
- django学习-13.通过pk值手动设置数据表主键
1.前言 通过django框架的Model层来新增数据库表时,如果在需要新增的表字段里任何一个表字段都没设置主键,框架会默认新增一个表字段id并把该表字段id设置为主键. 那么,如果我们想自己动手设置 ...
- docker仓库之分布式harbor (一)
1.harbor介绍 harbor是一个用于存储和分发docker镜像的企业级Registry服务器,由VMware开源.其通过添加一些企业必须的功能特性,例如安全,标识和管理,扩展了开源docker ...
- 看完我的笔记不懂也会懂----Ajax
Ajax(Asynchronous JavaScript And XML) - 本次学习所用到的插件 - XML - JSON - 关于AJAX - HTTP协议 - AJAX重点之XMLHttpRe ...
- AXU2CGB开发板验证Vitis加速基本平台创建
Vitis 加速基本平台创建 1.Vivado 工程创建,硬件平台bd 图如下所示 1.1.双击Block图中ZYNQ核,配置相关参数 1.1.1.Low Speed 配置,在 I/O Configu ...