SQL语句是如何在MySQL中执行的

一、先明确 MySQL 核心架构:Server 层 + 存储引擎层

MySQL 的架构分为两大核心层,所有 SQL 语句的执行都会先经过 Server 层的统一处理,再由存储引擎层完成数据的实际存取

  • Server 层:是 MySQL 的核心,包含连接器、查询缓存(8.0 移除)、分析器、优化器、执行器等核心组件,还涵盖所有内置函数(如字符串、日期计算)、存储过程、触发器、视图等,跨存储引擎的功能都在这一层实现;
  • 存储引擎层:负责数据的存储和提取(如 InnoDB、MyISAM、Memory 等),以插件形式存在,Server 层通过统一接口与存储引擎交互,最常用的是 InnoDB(MySQL 5.5.5 后默认)。

二、Server 层核心组件(执行链路的核心节点)

1、连接器:建立连接,验证身份(所有 SQL 执行的第一步)

当客户端发起 MySQL 连接请求时,首先与连接器交互:

  • 核心动作
    1. 验证用户名 / 密码(错误则返回Access denied,连接终止);
    2. 验证通过后,查询该用户的权限(权限信息会缓存,后续整个连接周期内权限以本次查询为准,即使中途修改用户权限,当前连接也不受影响);
    3. 建立 TCP 连接,进入 "空闲状态"(可通过show processlist看到Sleep状态的连接),客户端闲置超wait_timeout(默认 8 小时)则自动断开。
  • 关键作用:是客户端与 MySQL 交互的 "入口",负责连接管理、身份认证、权限缓存。

2、查询缓存:缓存查询结果(MySQL 8.0 已移除,仅作历史说明)

连接器建立连接后,若为查询语句(如SELECT),MySQL 8.0 之前会先查查询缓存:

  • 核心逻辑:以 "查询语句字符串" 为 Key,查询结果为 Value,缓存到内存中;若缓存命中,直接返回结果,跳过后续分析 / 优化 / 执行步骤;若未命中,继续后续流程。
  • 被移除的原因:缓存失效成本极高(只要表数据有更新,该表所有查询缓存都会清空),实际生产中(如频繁更新的业务表)缓存命中率极低,反而增加性能开销。

3、分析器:解析 SQL,判断 "语法是否合法 + 要做什么"

若跳过 / 未命中查询缓存,SQL 进入分析器,核心做 "词法分析" 和 "语法分析":

  • 词法分析 :拆解 SQL 语句,识别关键词和元素。例如SELECT id FROM user WHERE age = 18;,会识别出:这是SELECT查询语句,查询列是id,查询表是user,条件是age=18
  • 语法分析 :校验 SQL 语法是否符合 MySQL 规范(如关键词拼写错误、缺少分号、表名 / 列名不存在等),若语法错误,返回You have an error in your SQL syntax
  • 关键输出:生成 "语法树"(描述 SQL 要执行的逻辑),传递给优化器。

4、优化器:选择最优执行方案

分析器确定 "要做什么" 后,优化器决定 "怎么做"------ 在多个可行的执行计划中选择成本最低的:

  • 优化场景举例
    1. 多表关联查询(如JOIN):决定表的连接顺序(先查小表还是大表);
    2. 索引选择:若 WHERE 条件有多个索引可选,选择最优索引(如区分度高的索引);
    3. 执行计划优化:如是否使用覆盖索引、是否走全表扫描等。
  • 关键输出 :生成 "执行计划"(可通过EXPLAIN查看),传递给执行器。

5、执行器:执行 SQL,与存储引擎交互

优化器生成执行计划后,执行器开始实际执行,核心步骤:

  1. 权限校验:再次校验当前用户对目标表 / 列的操作权限(避免连接器缓存权限后权限变更),无权限则返回错误;
  2. 调用存储引擎接口:根据执行计划,向存储引擎发起数据存取请求(如读取行、更新行);
  3. 处理结果
    • 若为查询语句:遍历存储引擎返回的结果集,返回给客户端;
    • 若为更新语句:执行数据修改,并触发事务日志(redo log/undo log)写入。

三、不同 SQL 语句的执行过程拆解

1、查询语句

完整链路:

复制代码
客户端发起请求 → 连接器(建立连接+认证+权限缓存)→ 查询缓存(8.0跳过)→ 分析器(词法/语法分析→生成语法树)→ 优化器(选择索引/执行计划)→ 执行器(权限校验→调用InnoDB接口读取数据)→ 存储引擎(读取数据:走age索引→返回id)→ 执行器(整理结果)→ 返回客户端
  • 执行器执行时,会逐行调用存储引擎的next_row接口读取数据,直到满足条件的所有行都被读取完毕。

2、更新语句

更新语句比查询多了 "事务日志" 和 "持久化" 环节(基于 InnoDB),完整链路:

复制代码
客户端发起请求 → 连接器(建立连接+认证+权限缓存)→ 分析器(解析UPDATE语句,确认目标表/列/条件)→ 优化器(选择id索引作为执行计划)→ 执行器(权限校验→调用InnoDB接口)→ 存储引擎(执行更新):
   1. 加行锁(id=1的行,避免并发更新冲突);
   2. 读取原数据(生成undo log,用于事务回滚);
   3. 修改数据(内存中更新name字段);
   4. 写入redo log(标记为"准备状态",保证崩溃恢复);
→ 执行器(触发binlog写入,记录更新逻辑)→ 存储引擎(将redo log标记为"提交状态",事务提交)→ 返回客户端"更新成功"
  • WAL 机制:InnoDB 为了性能,更新时先写内存和 redo log(磁盘顺序写),而非直接刷磁盘,后续由后台线程异步将内存数据刷到磁盘(落盘),保证性能和数据可靠性。

四、总结

  1. 核心逻辑:所有 SQL 语句的执行都遵循 "连接→解析→优化→执行" 的核心流程,Server 层负责逻辑处理,存储引擎层负责数据存取,分层架构保证了功能解耦和扩展性;
  2. 查询 vs 更新:查询语句核心是 "读取数据",流程更简洁;更新语句需额外处理锁、事务日志(redo/undo log)、binlog,保证数据一致性和可恢复性;
  3. 关键组件
    • 连接器:连接管理的基础;
    • 分析器:保证 SQL "合法";
    • 优化器:保证 SQL "高效";
    • 执行器:保证 SQL "正确执行" 并与存储引擎交互;
    • 存储引擎:保证数据 "安全存取"(事务、锁、索引等)。
相关推荐
么么...2 小时前
掌握 MySQL:数据类型、数据定义语言DDL、数据操作语言DML
数据库·经验分享·sql·mysql
蓝影铁哥2 小时前
浅谈5款Java微服务开发框架
java·linux·运维·开发语言·数据库·微服务·架构
马克学长2 小时前
SSM校园公益活动网站7a9p4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·校园公益活动网站
李慕婉学姐2 小时前
Springboot在线阅读平台的设计与实现5yy58005(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
IT 行者2 小时前
Spring Authorization Server 迁移至 Spring Security 7.0:变革与展望
java·数据库·spring
码农学院2 小时前
Mysql 是如何解决幻读问题的?
数据库·mysql
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue高校实验室教学管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
net3m332 小时前
websocket下发mp3帧数据时一个包被分包为几个子包而导致mp3解码失败而播放卡顿有杂音或断播的解决方法
开发语言·数据库·python
TG:@yunlaoda360 云老大2 小时前
华为云国际站代理商WeLink的资源与工具支持具体有哪些?
服务器·数据库·华为云