文章目录
一、执行一条 select 语句,期间发生了什么?
1. 连接器
与客户端建立连接(TCP,三次握手)
校验客户端的用户名和密码
读取用户权限,后面的逻辑判断都基于此处的权限
2. 查询缓存
<key, value>
==<SQL查询语句,查询结果>
对于一个表,只要有更新操作,就清空这张表的查询缓存,所以查询缓存比较鸡肋
可以通过将参数
query_cache_type
由 ON 设置为 OFF 或者 DEMAND这里说的查询缓存是 server 层的,不是 Innodb 存储引擎中的 buffer pool
3. 解析 SQL – 解析器
词法分析,识别关键词
语法分析,构建语法树
解析器只是负责检查语法和构建语法树,不负责检查表或字段是否存在
4. 执行 SQL
预处理器–prepare
检查表或字段是否存在
扩展
select *
中的*
优化器–optimize
- 确定执行方案,如选择索引
执行器–execute
- 对于在索引中包含的字段的判断,从执行器下推到执行引擎,减少了回表操作
在MySQL数据库中,show processlist 的结果中出现的 Id 是怎么分配的,为什么只有一个连接的时候Id为2,而不是1?
- 在MySQL中,连接ID为1通常会保留用于特殊用途,比如主线程或系统线程。因此,第一个分配给客户端的连接ID通常是2。这是出于系统设计和管理的考虑,以便将主要的系统任务与普通客户端连接区分开来。