mysql源代码分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mysql源代码分析系列(2): 源代码结构
Mysql源代码主要包括客户端程序代码,服务器端代码,测试工具和一些库构成,下面我们对比较重要的目录做些介绍。
BUILD
这个目录在本系列的上篇文章中我们仔细看过,内含各种平台的编译脚本,这里就不仔细说了。
client
这个目录下有如下比较让人眼熟的文件: , , , ,等等,如果你编译一下就会发现那些眼熟的程序也出现了,比如mysql。明白了吧,这个目录就是那些客户端程序所在的目录。这个目录的内容也比较少,而且也不是我们阅读的重点。
Docs
这个目录包含了文档。
storage
这个目录包含了所谓的Mysql存储引擎(storage engine)。存储引擎是数据库系统的核心,封装了数据库文件的操作,是数据库系统是否强大最重要的因素。Mysql实现了一个抽象接口层,叫做handler(sql/,其中定义了接口函数,比如:ha_open, ha_index_end, ha_create等等,存储引擎需要实现这些接口才能被系统使用。这个接口定义超级复杂,有900多行:-(,不过我们暂时知道它是干什么的就好了,没必要深究每行代码。对于具体每种引擎的特点,我推荐大家去看mysql的在线文档:
应该能看到如下的目录:
* innobase, innodb的目录,当前最流行的存储引擎
* myisam, 最早的Mysql存储引擎,一直到innodb出现以前,使用最广的引擎。
* heap, 基于内存的存储引擎
* federated, 一个比较新的存储引擎
* example, csv,这几个大家可以作为自己写存储引擎时的参考实现,比较容易读懂
mysys
包含了对于系统调用的封装,用以方便实现跨平台。大家看看文件名就大概知道是什么情况了。
sql
这个目录是另外一个大块头,你应该会看到,没错,这里就是数据库主程序mysqld所在的地方。大部分的系统流程都发生在这里。你还能看到, , ,等等,分别实现了对应的SQL命令。后面我们还要经常提到这个目录下的文件。
大概有如下及部分:
SQL解析器代码: , , , 等,实现了对SQL语句的解析操作。
"handler"代码: , ,定义了存储引擎的接口。
"item"代码:, ,定义了SQL解析后的各个部分。
SQL语句执行代码: , , , ,执行SQL对应的语句。当你要看"SELECT ..."的执行的时候,直接到去看就OK了。
辅助代码: 实现网络操作
还有其他很多代码。
vio
封装了virtual IO接口,主要是封装了各种协议的网络操作。
plugin
插件的目录,目前有一个全文搜索插件(只能用在myisam存储引擎)。
libmysqld
Mysql连接库源代码。
开源函数库目录
和所有的开源项目一样,Mysql也使用了一些开源的库,在其代码库中我们能看到dbug、pstack、strings、zlib等。
多说无益,主要是对于mysql的代码目录有个概念,要找的时候也有个方向。万一要找某个东西找不到了就只能grep了...
Mysql源代码分析系列(3): 主要调用流程
引言
本文主要介绍Mysql主要的调用流程,将从代码的角度来看一个从用户发出的"select * from test" SQL
命令在服务器内部是如何被执行的。从我个人的经验来看,阅读理解大规模项目的代码最重要的两个方面,一是了解主要的数据结构,二是了解数据流,在这里主要是调用流程。把这两个主线把握住以后,大部分代码都是比较容易阅读的,Mysql的源代码属于比较好读的类型,因为函数的调用关系比较明确。难读的代码一般都充斥着大量的回调、异步调用,很可能你极难找到某个函数在哪里或什么时候被调用了。当然,算法的实现代码也很难读。幸好Mysql不是那种难读的类型,所以我们也不要害怕,大步向前吧!
主要执行过程
从架构上来看,Mysql服务器对于一条SQL语句的执行过程可以分成如下几部分:
接受命令包括用户验证,资源申请等
|
V
命令解析解析SQL语句,生成语法树
|
V
寻找执行计划根据解析出来的语法树,找到可能的执行计划。对于一条SQL语句,很可能会有多种执行方案,特别是在SQL语句比较复杂的时候。这里需要对于各种可能的方案进行代价评估,最快的找到最有的执行方案。
|
V
优化执行计划优化执行计划。这是SQL执行中最复杂的部分之一,据说全都是由数学博士们写出来的,而且比较难懂。我目前还处于不懂的状态。
|
V
执行没啥可说的,只剩执行及返回结果了
系统启动
所有的程序都从main开始,mysqld也不例外,打开sql/,稍加搜索,你就能看到熟悉的main函数,我们可以将其进行如下简写:
int main(int argc, char* argv[]) {
();
init_common_variables(MYSQL_CONFIG_NAME, argc, argv,
load_default_groups)); .); .); .;
case COM_TABLE_DUMP: ...;
case COM_CHANGE_USER: ...;
...
case COM_QUERY:
alloc_query(thd, packet, packet_length);
mysql_parse(thd, thd->query, thd->query_length, &end_of_stmt);
}
}