主要关键目录
MySQL最主要的几个目录,按字母顺序:
- BUILD
- client
- storage
- mysys
- sql
- vio
BUILD目录
BUILD:编译和安装脚本目录。该目录中文件数量较少,绝大部分都是以compile-开头。compile文件时用来对MySQL源代码进行各种编译的脚本文件。
例如compile-pentium-debug文件:
#1 /bin/sh
path='dirname $0'
set -- "$@" --with-debug=full
. *$path/SETUP.sh*
extra_flags="$pentium_cflags $debug_cflags"
extra_configs="$pentium_configs $debug_configs"
. *$path/FINISH.sh*
该脚本调用了同目录下的SETUP.sh和FINISH.sh脚本,并添加了$debug_cflags和$debug_configs两个debug编译选项。SETUP.sh脚本为C和C++编译器设置了优化选项。
compile-pentium-debug文件执行顺利的话,最后读者在目标目录中能够得到MySQL服务器的二进制可执行文件(Binary File)。
client目录
该目录下包含的文件:
client_priv.h CMakeLists.txt
completion_hash.cc conmletion_hash.h
echo.c get_password.c
Makefile.am Makefile.in
my_readline.h mysqladmin.cc
musqlbinlog,cc my_user.c
mysql.cc mysqlcheck.cc
mysqldump.cc mysqlimport.c
mysqlshow.c mysqlslap.c
mysqltest.cc mysql_upgrade.c
readline.cc sql_string.cc
sql_string.h
storage目录
MySQL和各类存储引擎代码在storage这个大目录中:
drwxr-xr-x archive
drwxr-xr-x blackhole
drwxr-xr-x csv
drwxr-xr-x example
drwxr-xr-x fedarated
drwxr-xr-x heap
drwxr-xr-x ibmdb2i
drwxr-xr-x innobase
drwxr-xr-x myisam
drwxr-xr-x myisammrg
drwxr-xr-x ndb
举例:以MyISAM为例,myisam和myisammrg目录包含了该存储引擎的代码,myisammrg目录文件为merge表提供支持,myisam是MyISAM存储引擎的主要目录。该目录下可以找到MyISAM处理IO等操作的源代码:
mi_rsame.c
mi_rsamepos.c
mi_scan.c
mi_search.c
mi_static.c
mi_statrec.c
mi_test1.c
mi_test2.c
mi_test3.c
mi_test_all.res
mi_test_all.sh
mi_unique.c
mi_update.c
mi_write.c
可以看出MyISAM的源文件大部分都是以mi开头,
mysys目录
MySQL system library的简写,是MySQL的库函数文件,一种可执行的二进制形式,可以被操作系统载入内存中执行。在mysys目录中有125个.c文件,这些库函数还将不断扩大。库文件编译后在Windows上是.lib和.dll文件,在Linux和Unix上是.so和.a文件。
mysys目录包含各种各样的功能库文件,包括文件打开、数据读写、内存分配、OS/2系统特别优化、线程控制、权限控制、Raid Table、动态字符串处理、队列算法、网络传输协议、初始化函数、错误处理、平衡二叉树算法、符号连接处理、唯一临时文件名生成、hash函数、排序算法、压缩传输协议等。
sql目录
这个目录是MySQL源代码中需要经常变化的目录之一,大部分已有bug也来自于该目录中的文件。主要包括mysqld.cc这一MySQL.main函数所在文件、各类SQL语句的解析/实现。
这里有我们熟知的两个模块:
sql_lex.cc 词法解析模块
sql_yacc 语法解析模块
各种SQL语句的执行代码也可以在sql目录中找到:
sql_delete.cc delete语句
sql_do.cc 操作语句
sql_help.cc help帮助语句
sql_insert.cc 插入语句
sql_select.cc select语句
sql_show.cc show语句
vio目录
VIO意指Virtual I/O,主要用来处理各种网络协议的IO。Vitual I/O使得各模块的网络协议能够无缝地调用I/O功能。MySQL网络子系统将调用这里的方法。
执行流
client 用户输入SELECT语句
vio 信息通过TCP/IP网络传入
sql 服务器解析SQL语句:Lex和YACC将SQL语句解析并生成语法树,该语法树最终由底层sql目录中sql_select.cc执行
storage MySQL调用存储引擎:独立的handler.cc接收到最后的请求并执行这个语句
mysys 引擎文件调用库文件从物理文件中读取内容:Handler依靠storage目录下的具体存储引擎代码和函数读取数据