一条查询sql的执行过程
-
查询语句执行流程如下: 权限校验(如果命中缓存)–> 查询缓存 —> 分析器 --> 优化器 —> 权限校验 —> 执行器 —> 引擎
-
建立连接:客户端通过 TCP 连接发送连接请求到 MySQL 连接器,连接器会对该请求进行权限验 证及连接资源分配
-
查询缓存:存在缓存则直接返回,不存在则执行后续操作
-
之前执行过的语句会以KV的形式缓存在内存中,key 是查询的语句,value 是查询的结果。查询之前先查找之前执行过的相同语句。
-
不推荐使用缓存:数据表修改后,会删除所有相关缓存
-
-
分析器:对SQL进行词法分析和语法分析操作。
-
优化器:根据
SQL
制定出不同的执行方案,并择选出最优的执行计划。- 多条件查询时,重排条件先后顺序,将效率更好的字段条件放在前面。
- 当表中存在多个索引时,选择效率最高的索引作为本次查询的目标索引。
- 使用分页
Limit
关键字时,查询到对应的数据条数后终止扫表。 - 多表
join
联查时,对查询表的顺序重新定义,同样以效率为准。 - 对于sql中使用函数时,根据情况选择最优方案。
max()
函数:走B+
树最右侧的节点查询(大的在右,小的在左)。min()
函数:走B+
树最左侧的节点查询。count()
函数:如果是MyISAM
引擎,直接获取引擎统计的总行数。......
- 对于
group by
分组排序,会先查询所有数据后再统一排序,而不是一开始就排序。 - …
-
执行器:权限校验,调用存储引擎。
-
执行器首先校验此用户对目标数据有无权限。
-
执行器会以行为粒度,调用存储引擎执行SQL,在没有索引的情况下,执行器会循环查询所有行。
-
-
-
更新语句执行流程如下: 分析器 —> 优化器 —> 权限校验 —> 执行器 —> 引擎 —> redo log(prepare) —> binlog —> redo log(commit)
update tb_employee set level = '5' where name='张三'
-
先查询到张三这一条数据,如果有缓存,也是会用到缓存。
-
然后拿到记录,把 level 改为 5,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。
-
执行器收到通知后记录 binlog,然后调用引擎接口,提交 redo log 为提交状态。
-