Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > SQL语句在MySQL的执行过程

SQL语句在MySQL的执行过程详解

作者:理想奋斗中

这篇文章主要介绍了SQL语句在MySQL的执行过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MySQL基础架构

先对MySQL的一些基础组件进行简单的介绍

MySQL主要分为server层和存储引擎层。

说了这么多,那么SQL语句到底在MySQL中是怎么执行的呢?

SQL语句分析分为查询语句和更新语句。

查询语句

select * from tb_student  A where A.age='18' and A.name=' 张三 ';

结合上面的说明,我们来结合这条查询语句分析一下执行过程:

先查询该语句是否有权限,如果没有权限直接报错,如果有权限,在MySQL8.0版本前会查询缓存,以这条SQL语句为key看是否命中缓存,命中直接返回缓存,没有命中执行下一步。

通过分析器提取该SQL语句中的关键字,如select、from、表名tb_student、查询的列、等等,然后判断这个SQL语句是否有错误,比如关键字是否拼写错误,没有错误执行下一步。

接下来就是优化器确定执行方案,上面SQL语句有两种执行方案,a先查询年龄为18,然后查询name为张三的数据,b先查询name为张三,然后查询age为18的数据,优化器会根据内部的优化算法进行选择执行效率最高的一个方案,确定执行计划后开始执行语句。

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

更新语句

update tb_student A set A.age='19' where A.name=' 张三 ';

执行更新语句不同的是要进行日志记录了,这时候就要引进日志模块了,MySQL自带的日志是binlog日志,所有存储引擎都可以使用,InnoDB引擎有redo log日志,我们就以InnoDB引擎来分析一下这条更新语句的执行过程:

先查询出张三这一条数据,不会走查询缓存,因为更新语句会导致与该表相关的查询缓存失效。

拿到数据后将age改为19,然后调用引擎API接口,写入这一行数据,InnoDB引擎把数据保存在内存,同时记录redo log,此时redo log状态为prepare,并告诉执行器,执行完成,随时可以提交。

执行器接收通知后,记录binlog,并提交reod log。

肯定有人疑惑,这里为什么要用两个日志记录,不能用一个日志记录吗?

主要原因如下:

功能不同:

恢复需求不同:

总结

只用redo log或binlog无法同时满足以上的功能和恢复需求,所以要同时使用redo log和binlog。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文