MySQL开发与调试指南 说明
# 前言
# MySQL开发与调试指南 翻译说明
几年前,我因为工作需要,需要深入地了解MySQL,在看了各种所谓的资料之后,总是感觉还是雾里看花,各种所谓的MySQL高级技能都貌似语焉不详,于是我萌生了阅读MySQL源码的念头。
在一边调试MySQL源码一边寻找相关资料时,发现了这本《Understanding MySQL Internals》,虽然源码版本有些过时,但瑕不掩瑜,它给我阅读和调试MySQL很大的帮助。
这是当时调试MySQL Server的截图:
限于水平有限,如果您在阅读过程中有任何问题,可以联系小方(微信cppxiaofang),也欢迎加入小方的 技术交流群,群里面有很多开发高手,不定期发布招聘信息,加群请备注“加微信群”。
小方微信公众号【CppGuide】:
# 目标读者
本书对很多读者都有用:
- 想要以某种方式扩展MySQL的开发者;
- 对MySQL如何精确运行查询感兴趣的数据库管理员(DBA)或数据库应用程序员;
- 学习数据库内核开发的计算机科学专业学生;
- 在开发需要自行实现大量数据库功能产品时寻找思路的开发者;
- 想知道MySQL为何能如此快速运行查询的闭源数据库开发者;
- 使用过MySQL并对其内部原理感到好奇的电脑极客;
- 当然,还有那些想在书架上摆一本关于MySQL内部原理的书,让自己看起来很专业的人。
虽然MySQL源代码是公开的,但如果你不理解它,本质上它对你来说仍是封闭的。面对天才程序员编写的几十万行代码,每行代码都巧妙而高效地解决着难题,可能会让人望而生畏。要理解这些代码,你需要付出一定的努力,就像那些创建它的人一样。希望这本书能提供足够的指导,帮你消除障碍,打开MySQL源代码的大门。
我认为仅通过概念性讨论无法真正理解和欣赏MySQL。从高层次的概念来看,MySQL非常简单。它并没有实现很多革命性的想法,而是坚持了基础理念。那它为什么如此受欢迎呢?为什么我们对它了解得足够多,以至于O’Reilly愿意出版一本关于其内部原理的书呢?
在我看来,一个优秀数据库的关键不在于其背后的概念,而在于这些概念的实现程度。在基本层面上保持概念合理固然重要,但很大一部分的巧妙之处在于以一种能够在良好性能和易于维护之间实现合理平衡的方式来实现这些概念。换句话说,细节决定成败,MySQL开发者在处理这些细节方面做得非常出色。
因此,为了理解MySQL的内部工作原理,你需要深入到那些攻克难题的地方。在优化器的深处或B树(B-tree)内部,当你研究代码时,会发现其中的精妙之处。要发现这些精妙之处需要付出一些努力,但一旦发现,你就能感受到它的魅力。为了发现这些精妙之处,你不能害怕编译代码,添加一些调试信息来帮助理解代码流程,甚至可以尝试修改一些内容,了解如果忽略某些重要内容会导致服务器崩溃(以及如何崩溃)。
第1章简要介绍了MySQL的不同组件如何协同工作。紧接着的一章讲述了如何从源代码下载和构建MySQL。如果你按照其中的步骤设置好一份可运行、可编译的代码副本,能够随意修改和测试,那么学习MySQL内部原理的过程会更有意义。
在接触新的代码库时,我发现查看类/结构定义和API调用原型非常有用。我承认:我通常先看代码,再看注释,除非有人要求,否则我从不看框图。第3章是为和我思维方式相似的开发者准备的,它讨论了核心服务器类、结构和API。
在第4章,我讨论了客户端和服务器之间的通信协议。希望读完之后,你会说:“我很感激MySQL API,甚至知道如果有必要的话该如何修改它!”
第5章讨论了服务器配置变量。配置变量是服务器的控制参数。每个配置变量都能让你了解服务器的某些特殊功能,或者是某个数据库管理员曾遇到并解决的问题。可以毫不夸张地说,理解了这些变量,你就理解了服务器。在这一章的结尾,你会看到如何添加自己的配置变量的教程。
每台服务器都必须处理如何并发处理多个客户端的问题。MySQL通过使用线程来解决这个问题。理解线程以及它们在MySQL中的使用方式,对于有效处理MySQL源代码至关重要。因此,第6章讨论了基于线程的请求处理。
MySQL架构的一个显著特点是能够集成第三方存储引擎。第7章重点介绍存储引擎接口,并提供了一个简单存储引擎的功能示例。
尽管目前MySQL支持多种页级和行级锁定的存储引擎,但核心架构在很大程度上继承了MyISAM的特性。其中一部分就是获取表锁的机制。即使表锁本质上只是一种象征性的锁,但对于有抱负的MySQL开发者来说,了解表锁仍然很重要。因此,第8章重点介绍表锁管理器。
第9章重点介绍解析器和优化器。对于想要提高MySQL性能的数据库管理员,我推荐阅读这一章。优化MySQL查询和表的关键是学会像优化器一样思考。这一章也为那些准备深入研究优化器的勇敢开发者提供了源代码概述。
第10章是对MySQL存储引擎的简要概述。对于想要创建或集成自己的存储引擎的开发者来说,这可能会有所帮助。好奇的读者如果想了解MySQL有哪些存储引擎,也可能会对这一章感兴趣。
第11章主要面向致力于将事务性存储引擎集成到MySQL中的开发者,而第12章则重点介绍复制的内部原理。
这本书绝不是MySQL内部原理的全面指南。这个主题非常深奥,即使有一万页的篇幅和足够的时间去创作,我认为也难以触及它的皮毛。更复杂的是,MySQL开发者每天都在添加新代码。幸运的是,大多数核心代码往往保持不变,所以这本书在出版前不太可能过时。不过,当你查看当前的MySQL代码时,如果发现有些内容与书中所述不太一样,也不要感到惊讶。你可能会看到新的类和API调用。有时,你可能会发现某个旧的API调用有了新的参数。但希望这本书始终能作为指南,教给你足够的代码基础知识,让你达到一定的熟练程度,实现自己的目标。
# 目录
前言
- MySQL的历史与架构
- MySQL的历史
- MySQL架构
- 使用MySQL源代码的基础操作
- Unix Shell
- BitKeeper
- 从BitKeeper代码库构建MySQL前的系统准备
- 从BitKeeper代码库构建MySQL
- 从源发行版构建
- 将MySQL安装到系统目录
- 源代码目录布局
- 准备在调试器中运行MySQL的系统
- 调试器引导的源代码浏览
- gdb的基本使用
- 在源代码中查找内容
- 有趣的断点和变量
- 进行源代码修改
- 编码规范
- 保持BitKeeper代码库更新
- 提交补丁
- 核心类、结构、变量和API
- THD
- NET
- TABLE
- Field
- 工具API调用
- 预处理宏
- 全局变量
- 客户端/服务器通信
- 协议概述
- 数据包格式
- MySQL协议与操作系统层的关系
- 认证握手
- 命令数据包
- 服务器响应
- 配置变量
- 配置变量教程
- 特定配置变量的有趣方面
- 基于线程的请求处理
- 线程与进程
- 请求处理的实现
- 线程编程问题
- 存储引擎接口
- handler类
- 向MySQL添加自定义存储引擎
- 并发访问控制
- 表锁管理器
- 解析器和优化器
- 解析器
- 优化器
- 存储引擎
- 架构的共性
- InnoDB
- Memory(堆)
- MyISAM Merge
- NDB
- Archive
- Federated
- 事务
- 事务性存储引擎实现概述
- 实现handler子类
- 定义handlerton
- 使用查询缓存
- 使用复制二进制日志
- 避免死锁
- 复制
- 概述
- 基于语句的复制与基于行的复制
- 双线程从库
- 多主模式
- 有助于理解复制的SQL命令
- 二进制日志格式
- 创建自定义复制工具