文章目录
- 1. 逻辑架构剖析
- 1.1 连接管理--连接层
- 1.2 解析与优化--服务层
- 1.3 存储引擎
- 2. SQL语句的执行流程
- 2.1 执行原理
- 2.2 语法顺序
1. 逻辑架构剖析
当一个客户端连接mysql服务器执行一条查询语句时,会发生以下处理过程:
1.1 连接管理–连接层
客户端想要执行一条sql语句,首先要和服务器进行连接,连接采用的TCP方式(三次握手),根据用户在客户端输入的用户名和密码,分为以下两种情况:
- 用户名或密码错误,显示连接失败
- 用户名和密码正确,会从mysql.user表中查出连接用户所拥有的权限,该用户后续的操作不能超过权限
ps: 对于每一个客户端都会有1个线程进行处理(线程在线程池中),mysql是一个单进程多线程程序
1.2 解析与优化–服务层
-
查询缓存
假设当前执行了一条sql语句
select * from emp;
, 那么这条语句和其查询结果会缓存起来,下次如果有一条一模一样的查询语句,就会命中缓存直接返回查询结果- 查询缓存可以在各个客户端之间共享
- 两条查询语句只要有任何字符上的不同,缓存都不会命中(比如多了一个空格,加了注释)
- 查询语句中如果使用了系统函数,这条查询语句不会被缓存
- 表的数据和结果如果被修改,之前对该表产生的查询缓存会无效并且被删除
- 查询缓存在mysql8.0中已经删除
-
语法解析
包括词法解析、语法解析、语义分析等过程
-
查询优化
- 外连接转换为内连接、表达式简化、子查询转为连接
- 对于一条sql语句可以有不同的执行过程,虽然最终返回的结果相同,但是执行效率会有所差异
1.3 存储引擎
- 数据的存储和提取操作都在存储引擎模块中
- 连接管理 、 查询缓存 、 语法解析 、 查询优化 这些并不涉及真实数据存储的功能划分为 MySQL server 的功能
- 真实存取数据的功能划分为 存储引擎 的功能
- 存储引擎向Server层提供了调用的API接口
- 常用的存储引擎有InnoDB和MyISAM
2. SQL语句的执行流程
2.1 执行原理
可以使用profile来查询某条语句的执行情况
-
先查看profiling是否开启:
select @@profiling;
如果显示0则说明未开启 -
未开启的话则使用
set profiling=1;
打开 -
执行一条查询语句,并查看当前会话的profiles
再次执行相同的查询语句,再次查看profiles:
两次查询的时间类似,在mysql8.0中没有使用查询缓存,查看详细的步骤: