SQL语句在MySQL内部的执行流程是什么?
一、SQL查询语句是如何执行的?
平时在工作中,都是用框架去执行一条SQL语句,那有没有想过一条SQL在MySQL内部到底经历了哪些流程呢?
首先我们来看一张MySQL的基本架构示意图:
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。
现在最常用的存储引擎是 InnoDB,它从 MySQL5.5.5 版本开始成为了默认存储引擎。
二、SQL更新语句是如何执行的?
先创建一张表:
接下来从一个表的一条更新语句看看整个流程是怎么样的:
(先更新数据还是先写日志?)
更新流程涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)
更新流程涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)
1.对数据文件的物理更改,保证总是先写日志,再更新数据,也就是所谓的WAL,即在持久化数据文件前,保证之前的redo log已经写到磁盘。
2.WAL即Write-Ahead Logging,在对数据页进行修改时, 通过将"修改了什么"这个操作记录在日志中, 而不必马上将更改内容刷新到磁盘上, 从而将随机写转换为顺序写,,提高了性能。【脏页的概念】