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

 更新时间:2025年05月26日 09:41:47   作者:理想奋斗中  
这篇文章主要介绍了SQL语句在MySQL的执行过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MySQL基础架构

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

  • 1.连接器:身份认证和权限相关。
  • 2.查询缓存:执行查询语句时,会先查询缓存(MySQL8.0版本后移除)。
  • 3.分析器:词法分析和语法分析,词法分析即对一条SQL语句中的关键字进行提取,如select、insert、update、表名、字段名等等,语法分析即查看SQL语句是否有语法错误。
  • 4.优化器:根据MySQL内部的优化算法按照最优方案执行SQL。
  • 5.执行器:执行语句,然后从存储引擎返回数据。

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

  • server层:包含连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图、函数等等,还有一个MySQL通用日志binlog日志模块。
  • 存储引擎层:主要负责数据的读取和存储采用可以替换的插件式架构,支持InnoDB、MyISAM、Memory等存储引擎,其中InnoDB引擎有自带的日志模块redo log,现在最常用的存储引擎是InnoDB,从MySQL5.5之后就是MySQL的默认引擎。

说了这么多,那么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是InnoDB特有的日志,用于保证事务的持久性。在数据库发生崩溃时,通过redo log可以将未持久化到磁盘的数据页恢复到内存,从而实现事务的持久化。
  • binlog是MySQL server层的日志,主要用于记录数据库所有的变更操作,用于数据恢复、主从复制等。

恢复需求不同:

  • redo log在数据库崩溃时,能让数据库恢复到崩溃前的一致状态,确保已提交的事务不会丢失。
  • binlog:binlog日志主要进行从某个位置或某个时间点恢复到另一个位置和时间点的恢复。

总结

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

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

相关文章

  • MySQL 升级方法指南大全

    MySQL 升级方法指南大全

    通常,从一个发布版本升级到另一个版本时,我们建议按照顺序来升级版本。例如,想要升级 MySQL 3.23 时,先升级到 MySQL 4.0,而不是直接升级到 MySQL 4.1 或 MySQL 5.0。
    2008-01-01
  • 详解MySQL下InnoDB引擎中的Memcached插件

    详解MySQL下InnoDB引擎中的Memcached插件

    这篇文章主要介绍了详解MySQL下InnoDB引擎中的Memcached插件,并且给出了实例演示,需要的朋友可以参考下
    2015-04-04
  • MySQL 8.0 之不可见列的基本操作

    MySQL 8.0 之不可见列的基本操作

    MySQL8.0.23之后引入了不可见列,今天我们来说说这个特性的基本使用,感兴趣的朋友可以了解下
    2021-05-05
  • 数据库工具sysbench安装教程和性能测试例子

    数据库工具sysbench安装教程和性能测试例子

    这篇文章主要介绍了数据库工具sysbench安装教程和性能测试例子,sysbench的一个简明入门教程,包含编译安装过程和主要测试数据,需要的朋友可以参考下
    2014-07-07
  • MySQL之FIND_IN_SET()的用法及说明

    MySQL之FIND_IN_SET()的用法及说明

    这篇文章主要介绍了MySQL之FIND_IN_SET()的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • MySQL索引失效的原因及实现逻辑

    MySQL索引失效的原因及实现逻辑

    在MySQL中索引失效指的是查询语句无法有效地使用索引,而必须进行全表扫描,索引失效可能会导致查询性能下降,特别是在处理大量数据时,这篇文章主要介绍了MySQL索引失效的原因及实现逻辑,需要的朋友可以参考下
    2025-12-12
  • 详解如何避免MYSQL主从延迟带来的读写问题

    详解如何避免MYSQL主从延迟带来的读写问题

    当在主库上进行更新后,有可能数据还没来得及同步到从库,但是这个时候又有读数据的需求,为了能正确读取出数据,这个时候就只有读主库了,所以本文给大家介绍了如何避免MYSQL主从延迟带来的读写问题,需要的朋友可以参考下
    2024-03-03
  • MYSQL的索引使用注意小结

    MYSQL的索引使用注意小结

    这篇文章主要介绍了MYSQL的索引使用注意,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接

    本篇文章是对SQL中的四种连接-左外连接、右外连接、内连接、全连接进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • Mysql基础入门 轻松学习Mysql命令

    Mysql基础入门 轻松学习Mysql命令

    这篇文章主要是Mysql基础入门教程,教大家如何轻松学习Mysql命令,并熟练掌握Mysql命令,感兴趣的小伙伴们可以参考一下
    2015-11-11

最新评论