【这一次,让我们一起来搞懂MySQL的底层】

📅 2026/8/6 3:45:39
【这一次,让我们一起来搞懂MySQL的底层】
课程B站大学记录学习极客时间团队MySQL45讲进阶数据分析和数据处理MySQL是数据分析的利刃MySQL基础架构一条SQL查询语句是如何执行的一、MySQL整体架构二、执行流程五步走1. 连接器 —— 建立连接2. 查询缓存 —— 基本可以不用3. 分析器 —— 你要做什么4. 优化器 —— 怎么做最快5. 执行器 —— 真正干活三、一句话总结日志系统一条SQL更新语句是如何执行的1. WAL 技术2. redo log重做日志3. binlog归档日志4. redo log vs binlog5. Update 执行流程两阶段提交为什么需要两阶段提交6. 必知参数生产环境建议MySQL基础架构一条SQL查询语句是如何执行的以一条最简单的查询语句为例拆解MySQL内部到底发生了什么select*fromTwhereID10;一、MySQL整体架构MySQL分为Server层和存储引擎层两大部分层级职责核心组件Server层核心服务功能、内置函数、跨引擎功能连接器、查询缓存、分析器、优化器、执行器存储引擎层数据存储与提取InnoDB默认、MyISAM、Memory等不同存储引擎共用同一个Server层。二、执行流程五步走1. 连接器 —— 建立连接负责与客户端建立连接、身份认证、权限读取连接成功后后续权限判断都基于此次读取的权限中途改权限不影响已存在的连接默认wait_timeout 8小时超时自动断开建议用长连接但注意定期重置避免内存泄漏MySQL 5.7 可用mysql_reset_connection2. 查询缓存 —— 基本可以不用以 SQL 语句为 key查询结果为 value 缓存只要表有更新该表所有缓存全部失效命中率极低MySQL 8.0 已彻底删除此功能3. 分析器 —— 你要做什么词法分析识别select是关键字、T是表名、ID是列名语法分析校验 SQL 是否符合 MySQL 语法规则语义校验检查表、列是否存在 → 报错Unknown column就在这个阶段4. 优化器 —— 怎么做最快选择使用哪个索引决定多表 JOIN 的连接顺序输出最终执行方案5. 执行器 —— 真正干活先校验用户对表是否有查询权限调用存储引擎接口逐行读取、判断、汇总结果集扫描行数记录在慢查询日志的rows_examined字段中三、一句话总结SQL 执行链路连接器 → 查询缓存 → 分析器 → 优化器 → 执行器各司其职定位问题时按流程排查即可。日志系统一条SQL更新语句是如何执行的更新语句同样要走连接器 - 分析器 - 优化器 - 执行器的流程但比查询多了两个核心日志redo log和binlog。1. WAL 技术MySQL 使用WAL (Write-Ahead Logging)即先写日志再写磁盘。粉板 (redo log)先记在内存/日志里速度快。账本 (磁盘)等有空了再慢慢落盘。目的降低 IO 随机写成本提升更新性能。2. redo log重做日志InnoDB 引擎特有用于保证Crash-Safe宕机不丢数据。物理日志记录“在某个数据页上做了什么修改”。循环写空间固定如 4 个 1G 文件写满后覆盖旧日志。核心图解write pos当前写的位置。checkpoint当前要擦除的位置。两者中间为空闲区若write pos追上checkpoint需先刷脏页腾空间。3. binlog归档日志MySQL Server 层实现所有引擎通用主要用于备份和恢复。逻辑日志记录语句的原始逻辑如UPDATE T SET c1 WHERE ID2。追加写文件写满切到下一份不会覆盖旧日志。核心作用全量备份 binlog可以恢复数据库到任意一秒的状态。4. redo log vs binlog特性redo logbinlog归属InnoDB 引擎层MySQL Server 层类型物理日志 (数据页修改)逻辑日志 (SQL 语句)写入循环写空间固定追加写永久保存用途Crash-Safe崩溃恢复主从复制数据归档5. Update 执行流程两阶段提交以update T set cc1 where ID2;为例执行器找引擎取 ID2 的行。执行器计算新值调用引擎写入。引擎更新内存写redo logPrepare 状态。执行器生成binlog并写入磁盘。执行器调用提交引擎把redo log改成Commit 状态。为什么需要两阶段提交为了保证 redo log 和 binlog 的逻辑一致性。若先写 redo 后写 binlog宕机会导致 binlog 缺失恢复数据不一致。若先写 binlog 后写 redo宕机会导致 redo 无效恢复数据也不一致。两阶段提交是分布式系统保证数据一致的经典方案。6. 必知参数生产环境建议-- 1. 每次事务提交redo log 持久化到磁盘防丢数据setglobalinnodb_flush_log_at_trx_commit1;-- 2. 每次事务提交binlog 持久化到磁盘防主从不一致setglobalsync_binlog1;更新语句 查询流程 日志系统。redo log负责宕机恢复Crash-Safebinlog负责备份恢复两阶段提交保证了二者的逻辑一致。实际上只靠mysql备份是远远不够当然本章节我们只是学习MYSQL快速回复数据备用数据这些都是运维和网络安全重要的知识点啦