MySQL一条SQL语句的执行过程可以大致分为以下几个步骤:
mysq分层架构
为了理解这个问题,先从Mysql的架构说起,对于Mysql来说,大致可以分为3层架构。
网络连接层: 作为客户端和服务端的连接,连接器负责处理和客户端的连接,还有一些权限认证之类。比如客户端通用用户名密码连接到Mysql服务器,还有对于数据库表的执行权限。
服务层:基本上Mysql大部分的核心功能都在这一层,包括查询缓存、解析器、优化器之类,比如SQL解析、优化、索引选择,到最后生成执行计划。
存储引擎层:Mysql通过执行引擎直接调用存储引擎API查询数据库中数据。
SQL执行流程
1. 客户端发起sql请求
2. 客户端与MySQL服务器建立连接,这一阶段由连接器负责处理,包括进行身份验证和权限确认等。
3. 如果是select语句,MySQL会检查查询缓存,如果所需查询的结果已经存在于缓存中,便直接返回缓存结果,从而省略后续的查询过程。查询缓存可以提高查询效率,特别是对于重复执行的查询。(Mysql8.0已删除了查询缓存)
4. MySQL 没有命中缓存,那么就会进入分析器,分析器核心功能包括语法检查,解析查询,生成解析树,语义检查。主要分三步:词法分析,语法分析和语义分析。
-
词法分析:
一条 SQL 语句有多个字符串组成,首先要提取关键字,比如 select,提出查询的表,提出字段名,提出查询条件等等。 -
语法分析:
根据MySQL的语法规则,将这些词法单元组织成一个解析树。 - 语义分析:检查解析树中的元素是否在数据库中有对应的实体,并验证操作的合法性。
5. 通过查询优化器将解析树转化成执行计划。优化器的工作过程从语义上可以分为四个阶段:
- 逻辑转换:包括否定消除、等值传递和常量传递、常量表达式求值、外连接转换为内连接、子查询转换、视图合并等;
- 优化准备:例如索引 ref 和 range 访问方法分析、查询条件扇出值(fan out,过滤后的记录数)分析、常量表检测;
- 基于成本优化:包括访问方法,连接顺序,索引的选择等;
- 执行计划改进:例如表条件下推、访问方法调整、排序避免以及索引条件下推。
6. 更新数据前会先记录undo log,用于事物回滚和实现事物MVCC可见性。
7. 判断所在记录是否在buffer pool中。
8. buffer pool 中进行select和update。buffer pool 和 change buffer参考InnoDB 缓存-CSDN博客
- 如果是select查询,如果记录存在buffer pool中就直接返回,如果不存在buffer pool中从磁盘读取之后放入buffer pool再返回。
- 如果是update操作,如果记录存在buffer pool中就直接判断唯一键冲突和数据更新。如果不存在,唯一索引需要从内存中读取数据进行唯一健冲突校验,普通索引的话就把变更记录到change buffer。
9. 操作记录存入redo log(prepare),WAL用于事物崩溃恢复,以及将随机写转换成顺序写提升写入性能。
10-13. 提交事物, 写入binlog和commit redo log。 【MySQL】一文彻底搞懂 Redo-log 为什么要两阶段提交?_mysql redolog两阶段提交-CSDN博客