MySQL执行语句流程
连接器
通过指令mysql -h 连接ip -u 登录用户名 -p
和MySQL服务建立TCP连接
然后连接器会对用户和密码进行校验,核对成功后保存用户的权限,后续用户的操作都会基于连接开始时的权限(意味着这时权限被更改,不会影响这次连接的操作权限)
- 通过
show processlist
查看当前客户端和服务建立连接数。
- 对于空闲连接,超过默认值自动断开。
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
- 查看最大连接数
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
查询缓存
连接器工作完成后,客户端就可以向MySQL服务发送SQL语句。
先解析第一个字段得出是什么类型的语句,如果是查询语句,就去查询缓存中查找数据,查询缓存以Key-Value形式保存在内存中。
Key为语句,Value为查询结果。
只要一个表有更新操作,那该表对应的查询缓存会清空。这样缓存的命中率太低,所以8.0版本废弃了查询缓存。
那8.0之前,也可以把query_cache_type
设置为DEMAND
关闭缓存。
解析器解析SQL
进行词法分析和语法分析
执行SQL
分为三阶段
- prepare 阶段,也就是预处理阶段;
- optimize 阶段,也就是优化阶段;
- execute 阶段,也就是执行阶段;
预处理器
- 检查 SQL 查询语句中的表或者字段是否存在;
- 将
select *
中的*
符号,扩展为表上的所有列;
优化器
主要负责将 SQL 查询语句的执行方案确定下来
执行器
和存储引擎进行交互,把查询条件给存储引擎,搜索出结果返回给执行器检验是否满足,满足则会发送给客户端(Server 层每从存储引擎读到一条记录就会发送给客户端,之所以客户端显示的时候是直接显示所有记录的,是因为客户端是等查询语句查询完成后,才会显示出所有的记录)