vlambda博客
学习文章列表

SQL语句在MySQL内部的执行流程是什么?

一、SQL查询语句是如何执行的?

平时在工作中,都是用框架去执行一条SQL语句,那有没有想过一条SQL在MySQL内部到底经历了哪些流程呢?


首先我们来看一张MySQL的基本架构示意图:


Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。

现在最常用的存储引擎是 InnoDB,它从 MySQL5.5.5 版本开始成为了默认存储引擎。


二、SQL更新语句是如何执行的?

先创建一张表:

SQL语句在MySQL内部的执行流程是什么?

接下来从一个表的一条更新语句看看整个流程是怎么样的:

(先更新数据还是先写日志?)

更新流程涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)

更新流程涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)

1.对数据文件的物理更改,保证总是先写日志,再更新数据,也就是所谓的WAL,即在持久化数据文件前,保证之前的redo log已经写到磁盘。

2.WAL即Write-Ahead Logging,在对数据页进行修改时, 通过将"修改了什么"这个操作记录在日志中, 而不必马上将更改内容刷新到磁盘上, 从而将随机写转换为顺序写,,提高了性能。【脏页的概念】