《MySQL》基础篇:语句执行过程

MySQL执行语句流程

《MySQL》基础篇:语句执行过程_第1张图片

连接器

通过指令mysql -h 连接ip -u 登录用户名 -p和MySQL服务建立TCP连接

然后连接器会对用户和密码进行校验,核对成功后保存用户的权限,后续用户的操作都会基于连接开始时的权限(意味着这时权限被更改,不会影响这次连接的操作权限)

  1. 通过show processlist查看当前客户端和服务建立连接数。

《MySQL》基础篇:语句执行过程_第2张图片

  1. 对于空闲连接,超过默认值自动断开。
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
  1. 查看最大连接数
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 层每从存储引擎读到一条记录就会发送给客户端,之所以客户端显示的时候是直接显示所有记录的,是因为客户端是等查询语句查询完成后,才会显示出所有的记录)

你可能感兴趣的:(MySQL,mysql,数据库)