本人打算在blog中写一个解析MySQL源代码的系列文章,如果时间允许的话。
首先说明一下。虽然MySQL 能够在多个操作平台下运行,但本系列基本上只注重於Linux平台。也许偶尔提及一下其他操作平台,如Windows。本系列所针对的MySQL版本为MySQL 5.0。
另外,本系列注重於解析MySQL。至于如何编译运行MySQL,大家可以参考manual相应部分。为方便解析MySQL,可能需要运行MySQL,为避免干扰主机可能已经运行的mysqld,建议大家将这里运行的MySQL的端口设置为3306之外的端口,如3321等;另外,将数据目录置于非系统缺省目录。这些都可以通过my.cnf设置。
1)MySQL总体结构
MySQL是普通的client/server架构。具体的说,有一个daemon运行在server端;client端通过TCP/IP或socket联机daemon,向daemon发送query 命令。
Daemon就是mysqld;在Windows, mysqld可以作为一个服务运行,具体如何设置可以参考mysql manual。另外,MySQL提供了一个常用的client---mysql。
这里先简单说一说mysqld。mysqld就总体来说,是一个while循环,在这个循环中,mysqld等待在select函数上。在正常情况下,select函数在有新来客户联机时返回。当select函数正常返回后,mysqld创建一个新的线程来处理新来的client所发出的查询命令;主线程由于在while循环中,又回到select的等待状态。
2)MySQL的代码结构
这里只说几个主要的子目录。其他的将在後文一一提及。
include(头文件)
sql(mysqld的大部分源代码,包括查询编译,查询处理,表的处理等。另外,mysqld所挂带的存储引擎,myisam,innodb,bdb等的接口文件也在这里。编译完成后mysqld位于此地)
libmysqld(mysqld所用库的源文件)
sql-common(mysqld和下面将说到的client所共用的一些源文件)
client(client端应用程序源文件,如mysql,mysqladmin)
mysys(一些基本的工具例程)
myisam,innobase,bdb(存储引擎的源文件)