MySQL 语句执行过程
另一个参考
客户端与服务器连接 -> 握手身份认证 -> 通过报文发送 SQL 请求 -> 分析器分析 mysql 语句 -> 优化器对 mysql 执行计划进行优化 -> 执行器执行 mysql 语句 -> 存储引擎进行查询 -> 返回结果集1435518-20181115100121743-248081780.png
关于其他一些,在之前的mysql 架构中讲了,这里可以看下前面的(mysql架构
这里主要对语句进行分析:语句可分为查询类和更新类

1.语句分析:

1.1 查询语句:

  1. select * from student A where A.age = '18' and A.name = 'zhangsan';

上面语句的执行流程:

  • 先检查该语句是否有权限,如果没有权限,直接返回错误信息。如果有权限,会先查询缓存,假如以这条 sql 为 key 在内存中查询是否有结果。如果有直接返回,否则继续下一步。
  • 对这个 sql 进行词法分析,提取 sql 语句的关键元素,比如提取上面这个语句是查询 select ,然后需要查询的表名为 student,需要查询所有的列,查询条件为这个表的

    1. id = ' 1 '。然后判断是否存在语法错误
  • 优化器确定执行方案,优化器根据优化算法确定一个执行效率最好的方案,然后开始准备执行

  • 进行权限校验,如果没有权限就会返回错误信息,有权限就会调用数据库引擎接口,返回执行结果

    1.2 更新语句:

    1. 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