1、初始化模块。
mysql启动的时候。初始化模块接管控制权。
初始化模块。读取配置文件。命令行参数。
分配全局内存缓存、初始化全局变量、结构信息、载入访问控制表、执行一些其他的初始化任务。
一旦初始化工作完成后,初始化模块把控制权交给连接管理器。开始接受客户端的连接。
读取配置文件的路径。
/usr/libexec/mysqld --verbose --help | less
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
2、连接管理模块。
初始化完成后。会把控制权给连接管理模块。
负责客户端的连接
当一个客户端的连接进来的时候,连接管理器执行一些网络协议任务。
并把控制权交给线程管理器。
3、线程管理模块。
连接管理器把控制权交给线程管理模块后。
线程管理模块,提高线程。这个线程可能是线程池里的。也可能是新建的。
一旦线程创建好之后,就把控制权交个用户模块。
4、用户模块。
一旦线程创建好之后,用户模块有了控制权。就会验证用户的
主机,用户,密码等。
验证成功后,就会把控制权交给命令分发器。
环境变量。
show global variables like ‘%connect%‘;
select @@max_connections;
服务器的最大连接数。
select @@max_user_connections;
当个用户的最大连接数。
实验:
set global max_connections=1;
select @@max_connections;
多开几个终端
会发现:ERROR 1040 (HY000): Too many connections
set global max_user_connections=1;
状态变量:
show global status like ‘%connect%‘;
Aborted_connects被拒绝的连接次数。比如用户,密码错误
Connections 被连接的次数。不管失败,成功都加1.
Max_used_connections 最大的并发量。不管失败,成功都加1.
5、命令分发器。
命令发过来后,会把控制权交给命令分发器。
如果是查询语句,就交给查询缓存模块
并把一些操作记录下来。日志记录模块。
如果是一个query类型的请求。会将控制权交个query解析器。query解析器首先分析是不是一个select类型
的query。如果是,则调用查询缓存模块。。让他检查改query在查询缓存中是否存储。
如果有,则直接将cache中的数据返回给连接线程模块。然后返回给客户端。
如果不是一个可以被cahce的query类型。或者cache中没有改query的数据,那么query将被进行传回给
query解析器。query解析器,把控制权给query分发器。
6、查询缓存模块
如果是查询语句,就交给查询缓存模块
7、日志记录模块。
命令分发器。调用日志记录模块。记录i日志
8、命令解析器。解析命令是什么命令。
如果是查询的话。=》查询优化器。
修改表。====》表变更模块
维护、优化===》表维护模块
复制===》复制模块
状态===》状态模块。
9、访问控制模块。
上面执行完后。就交给了访问控制模块。
验证用户,有没有相关权限。
10、表管理模块。
表锁
11、存储引擎接口。
存储引擎调用存储引擎。
12、存储引擎,干活的。