MySQL 语句执行过程
另一个参考
客户端与服务器连接 -> 握手身份认证 -> 通过报文发送 SQL 请求 -> 分析器分析 mysql 语句 -> 优化器对 mysql 执行计划进行优化 -> 执行器执行 mysql 语句 -> 存储引擎进行查询 -> 返回结果集
关于其他一些,在之前的mysql 架构中讲了,这里可以看下前面的(mysql架构)
这里主要对语句进行分析:语句可分为查询类和更新类
1.语句分析:
1.1 查询语句:
select * from student A where A.age = '18' and A.name = 'zhangsan';
上面语句的执行流程:
- 先检查该语句是否有权限,如果没有权限,直接返回错误信息。如果有权限,会先查询缓存,假如以这条 sql 为 key 在内存中查询是否有结果。如果有直接返回,否则继续下一步。
对这个 sql 进行词法分析,提取 sql 语句的关键元素,比如提取上面这个语句是查询 select ,然后需要查询的表名为 student,需要查询所有的列,查询条件为这个表的
id = ' 1 '。然后判断是否存在语法错误
优化器确定执行方案,优化器根据优化算法确定一个执行效率最好的方案,然后开始准备执行
进行权限校验,如果没有权限就会返回错误信息,有权限就会调用数据库引擎接口,返回执行结果
1.2 更新语句:
update student A set A.age= '19' where A.name = 'zhangsan';
先查询到 ‘zhangsan’ 这一条数据,如果有缓存就用缓存
- 拿到查询的数据,把 age 改为 19,然后调用引擎 API 接口,写入一行数据,Innodb 引擎把数据保存在内存中,同时提交 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。
- 执行器收到通知后记录 binlog,然后调用引擎接口,提交redo log 为提交状态,更新完成。
2.总结:
•SQL 等执行过程分为两类,一类对于查询等过程如下:权限校验—-》查询缓存—-》分析器—-》优化器—-》权限校验—-》执行器—-》引擎
•对于更新等语句执行流程如下:分析器——》权限校验——》执行器—-》引擎—-redo log prepare—-》binlog—-》redo log commit
