《MySQL之MEMORY内存数据库存储引擎分析》.pdf
MySQL数据库之MEMORY存储引擎分析
MySQL数据库之MEMORY存储引擎分析
MMyySSQQLL数数据据库库之之MMEEMMOORRYY存存储储引引擎擎分分析析
李秉义
iceoray@
MySQL数据库之所以能够成为最流行,使用最多的开源数据库,其最重要的
原因就是它在吞吐量和速度方面相对于其它开源数据库的优势。本文首先分析
MySQL数据库的整体架构。然后从MEMORY存储引擎的核心类,存储管理机制
以及同步互斥机制三方面入手进行分析。
1 MySQL数据库系统架构概述
SashaPachev在《UnderstandingMySQLInternals》中试图对MySQL进行模块
化的分割,但是同时说明仅是试图这样进行模块化的分割。MySQL的核心开发人
员倾向于直接提到文件,目录,类,结构以及函数,因为他们对代码非常熟悉。
SashaPachev的分割方法仅仅是便于对MySQL的理解,因为一个模块涉及到的代
码有可能分布在几个源文件中,一个源文件中也有可能涉及到几个模块的函数。
特别是在一些版本较早的源码中,新版本的源码试图去让代码更加模块化。Sasha
Pachev的模块只是逻辑意义上的。
祝定泽的《MySQL核心内幕》一书中认为,MySQL基本上是用C++编写的,
代码中同时混合使用了C,且在面向过程的代码中使用了很多类,但这些类仅是负
责数据类型的表示,没有太多体现面向对象编程的思想。MySQL并不是真正意义
上的模块化结构。
MichaelKruckenberg JayPipes ProMySQL CharlesA.Bell Expert
和 在《 》, 在《
1
MySQL》中对MySQL的系统架构也表达了相同的观点。
MySQL数据库提供了一个测试框架,可用于对MySQL进行修改后的回归测
试。
1MySQL ( UnderstandingMySQLInternals )
图 系统架构 《 》
按照SashaPachev在《UnderstandingMySQLInternals》中对MySQL系统模块
1 ConnectionManager
的划分如图 所示, 模块负责监听客户端的请求,当有请求发
2
来时,就将请求转给ThreadManager模块,后者负责管理服务器中的所有线程,
并且如果设置了线程缓存,同时还负责缓存线程的管理。每当有新的请求发来时,
它就会先试图从线程缓存中分配一个线程来处理请求,如果缓存中没有线程,则
负责新建一个线程来处理请求。然后UserModule负责验证用户的登录信息,如果
通过验证,则继续交给CommanderDispatcher模块。CommanderDispatcher模块负
责检查用户的命令是否在QueryCache中,如果在,则直接从缓存中返回结果,如
果不在,则将命令交给Parser模块进行命令解析。同时将用户命令传给日志模块
(LoggingModule),日志模块负责记录三种日志,二进制更新日志(binaryupdate
log),命令日志(Commandlog)以及慢查询日志(slowquerylog)。Parser模块在收到
命令后,将对命令进行解析,生成解析树。并根据命令的类型,分派给更低一级
的模块执行。这些模块会进一步将用户的命令发给访问控制模块(AccessControl
Module),该模块负责验证用户是否有足够的权限来执行当前命令。如果通过权限
验证,下一步就会由表管理模块(TableManager)来负责读写表的定义信息,通常存
.frm
储在 文件中。最后真正的低层的数据