mysqld服务程序结构
1、server层
连接层
- 验证用户的合法性(ip,端口,用户名,密码)
- 提供两种连接方式(socket,TCP/IP)
- 提供一个与SQL层交互的专用线程 (查看线程用show processlist;)
SQL层
-
接收连接层传来的SQL语句。
-
检查语法。
-
语义检查:判断SQL语句的类型
(1)DDL :数据定义语言
(2)DCL :数据控制语言
(3)DML :数据操作语言
(4)DQL: 数据查询语言 -
权限检查:用户对库和表有没有权限
-
解析器:对语句执行前,进行预处理,生成解析树(执行计划),说白了就是生成多种执行方案.
-
优化器:根据解析器得出的多种执行计划,进行判断,选择最优的执行计划,进行判断,选择最优的执行计划
-
执行器:根据最优执行计划,执行SQL语句,产生执行结果。
(1)提供跟存储引擎层交互的线程。
(2)接收返回数据,优化成表的形式返回SQL。 -
提供查询缓存(默认是没开启的),会使用redis等替代查询缓存功能(8.0取消,缓存机制比较low)
-
提供日志记录:binlog,默认是没开启的。
2、引擎层
- 负责根据SQL层执行的结果,从磁盘上拿相应的数据。
- 将16进制的磁盘数据,交由SQL结构化化成表格,
- 连接层的专用线程返回给用户。
总结
-
当我们想要执行sql语句的时候,我们首先要登陆进数据库,这个过程是连接层在工作,会验证用户的合法性,比如你登陆数据库的用户、ip、端口、密码是否正确,然后mysql有两种连接方式,socket和tcp/ip,看你是哪一种,最后提供一个与sql层交互的线程。
-
进入数据库,当我们使用sql语句查询的时候,sql层会判断你写的sql语句语法是否正确,检查sql语句是什么类型,检查用户对库表有没有权限。解析器会在sql语句执行前进行预处理,生成多种执行方案,优化器根据解析器得出的多种方案选择最优的执行计划,执行器根据最优计划执行sql语句(引擎层在工作),用表的形式产生结果,然后将数据存入缓存,记录binlog日志。