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性能优化方案,帮助大家进行Mysql性能优化,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • mysql sql99语法 内连接非等值连接详解

    mysql sql99语法 内连接非等值连接详解

    在本篇文章里小编给大家整理的是一篇关于mysql sql99语法 内连接非等值连接的相关知识点文章,有需要的朋友们可以学习下。
    2019-09-09
  • MYSQL主库切换binlog模式后主从同步错误的解决方案

    MYSQL主库切换binlog模式后主从同步错误的解决方案

    在使用FlinkSQL的mysql-cdc连接器来监听MySQL数据库时,通常需要将MySQL的binlog模式设置为ROW模式,当我们将MySQL主库的binlog模式从STATEMENT切换为ROW并重启MySQL服务后,MySQL从库在同步时可能会报错,所以本文介绍了MYSQL主库切换binlog模式后主从同步错误的解决方案
    2024-08-08
  • mysql 超大数据/表管理技巧

    mysql 超大数据/表管理技巧

    在实际应用中经过存储、优化可以做到在超过9千万数据中的查询响应速度控制在1到20毫秒。看上去是个不错的成绩,不过优化这条路没有终点,当我们的系统有超过几百人、上千人同时使用时,仍然会显的力不从心
    2013-03-03
  • 关于Mysql插入中文字符报错ERROR 1366(HY000)的解决方法

    关于Mysql插入中文字符报错ERROR 1366(HY000)的解决方法

    这篇文章主要介绍了关于Mysql插入中文字符报错ERROR 1366(HY000)的解决方法,在我们日常使用mysql的过程中会经常遇到各种报错,今天我们就来看一下ERROR 1366报错的解决方法吧
    2023-07-07
  • Mysql基础学习之LAG与LEAD开窗函数

    Mysql基础学习之LAG与LEAD开窗函数

    lead和lag是在SQL中用于创建窗口函数的两个常用函数,这篇文章主要给大家介绍了关于Mysql基础学习之LAG与LEAD开窗函数的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Mysql以utf8存储gbk输出的实现方法提供

    Mysql以utf8存储gbk输出的实现方法提供

    Mysql以utf8存储gbk输出的实现方法提供...
    2007-11-11
  • MySQL数据操作管理示例详解

    MySQL数据操作管理示例详解

    MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的应用软件之一。在本篇中,会让大家快速掌握MySQL的基本操作,并轻松使用MySQL数据库
    2022-09-09
  • mysql 5.7.21解压版安装配置方法图文教程(win10)

    mysql 5.7.21解压版安装配置方法图文教程(win10)

    这篇文章主要为大家详细介绍了win10下mysql 5.7.21解压版安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • mysql如何变更自增主键id起始值

    mysql如何变更自增主键id起始值

    这篇文章主要介绍了mysql如何变更自增主键id起始值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论