SQL语句执行过程
大约 4 分钟
SQL语句执行过程
1. MySQL 基础架构分析
MySQL 的架构主要分为两层:
- Server 层:通用部分,负责 SQL 解析、优化、执行等。
- 存储引擎层:具体实现数据存储和提取,支持多种存储引擎(如 InnoDB、MyISAM)。
1.1 MySQL 基本架构概览
+-----------------------------------+
| 客户端 |
+-----------------------------------+
|
+-----------------------------------+
| 连接管理层 |
+-----------------------------------+
|
+-----------------------------------+
| 查询解析与优化层 |
| SQL 解析、查询优化、执行计划生成 |
+-----------------------------------+
|
+-----------------------------------+
| 存储引擎 API 层 |
+-----------------------------------+
|
+-----------------------------------+
| 存储引擎层 |
| InnoDB、MyISAM、Memory等引擎 |
+-----------------------------------+1.2 Server 层基本组件介绍
连接管理:
- 管理客户端连接,分配线程。
- 支持长连接和短连接。
查询缓存(Query Cache):
- 缓存结果集,减少重复查询的开销。
- 已被 MySQL 8.0 废弃。
解析器(Parser):
- 将 SQL 语句解析为语法树(AST)。
查询优化器(Optimizer):
- 根据代价模型选择最优执行计划。
- 如选择合适的索引、JOIN 顺序等。
执行器(Executor):
- 按优化器生成的执行计划实际执行 SQL。
存储引擎:
- 通过存储引擎 API,调用具体存储引擎操作数据。
- InnoDB 是最常用的存储引擎。
2. SQL 语句执行流程分析
2.1 查询语句的执行流程
以 SELECT * FROM users WHERE id = 1; 为例,查询语句的执行流程如下:
1. 连接管理
- 客户端通过
TCP/IP或Socket连接到 MySQL。 - MySQL 分配线程池中的一个线程,负责处理该连接。
2. 查询缓存检查
- 作用:检查查询是否已缓存。
- 流程:
- 如果缓存命中,直接返回结果集。
- 如果未命中,进入下一步(MySQL 8.0 以上已移除)。
3. 语法解析
- 作用:将 SQL 转换为语法树。
- 流程:
- 解析器检查 SQL 语句的语法是否正确。
- 如果语法有误,返回错误信息。
4. 查询优化
- 作用:选择最优的执行计划。
- 流程:
- 分析表的统计信息(如索引、行数)。
- 判断是否使用索引,以及选择哪种索引。
- 确定 JOIN 顺序。
- 示例:
- 如果
users表的id列有索引,则优化器会选择使用索引进行查询。
- 如果
5. 权限校验
- 作用:检查当前用户是否有权限访问表或字段。
- 流程:
- 如果权限不足,则返回错误。
6. 执行器执行
- 作用:按优化器生成的计划,逐步执行查询。
- 流程:
- 根据索引或全表扫描,找到目标数据。
- 将结果集返回给客户端。
2.2 更新语句的执行流程
以 UPDATE users SET age = 30 WHERE id = 1; 为例,更新语句的执行流程如下:
1. 连接管理
- 同查询语句,建立连接并分配线程。
2. 查询缓存清除
- 作用:更新操作会使相关的查询缓存失效。
- 流程:
- 清除与
users表相关的缓存结果。
- 清除与
3. 语法解析
- 同查询语句,检查 SQL 语法并生成语法树。
4. 查询优化
- 作用:生成最优执行计划,找到需要更新的记录。
- 流程:
- 如果
id列有索引,则通过索引定位到目标行。
- 如果
5. 执行器执行
- 流程:
- 按执行计划定位目标行。
- 调用存储引擎修改数据。
- 生成 undo log,用于支持事务回滚。
- 修改数据并记录 redo log,保证数据持久性。
6. Binlog 写入
- 作用:记录更新操作,用于数据恢复和主从复制。
- 流程:
- 生成 binlog。
- 通过两阶段提交机制,确保 binlog 和 redo log 的一致性。
3. 总结
3.1 查询语句执行过程
- 连接管理:与客户端建立连接。
- 查询缓存:命中则直接返回,否则继续。
- 语法解析:检查 SQL 语法,生成语法树。
- 查询优化:选择最优的执行计划。
- 权限校验:检查用户权限。
- 执行器:调用存储引擎,执行计划。
3.2 更新语句执行过程
- 连接管理:与客户端建立连接。
- 查询缓存清除:清除与表相关的缓存。
- 语法解析:检查 SQL 语法。
- 查询优化:选择最优的执行计划。
- 执行器:调用存储引擎更新数据,记录 undo log 和 redo log。
- Binlog 写入:记录操作日志,用于恢复和复制。
3.3 存储引擎的作用
存储引擎负责:
- 数据的实际存储。
- 支持事务(如 undo log 和 redo log)。
- 提供索引支持(如 B+ 树索引)。
常见引擎:
- InnoDB:支持事务、行级锁,性能优秀。
- MyISAM:不支持事务,读性能优越。
4. 实际应用中的优化建议
- 使用 InnoDB 存储引擎:支持事务和 MVCC,适合大多数场景。
- 合理设计索引:优化查询性能,避免全表扫描。
- 避免查询缓存:MySQL 8.0 已废弃 Query Cache,不再依赖缓存。
- 减少锁冲突:通过批量更新、缩小事务范围提高并发性能。
- 监控慢查询:开启慢查询日志,分析执行时间长的 SQL。
