From 38c9664cb51f3febb932c417706654625fc5c889 Mon Sep 17 00:00:00 2001 From: Ka1Yan <2816841522@qq.com> Date: Fri, 23 Jan 2026 10:50:09 +0800 Subject: [PATCH] Update how-sql-executed-in-mysql.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 纠正因果关系倒置的问题,并添加缓存失效时机的说明。 --- docs/database/mysql/how-sql-executed-in-mysql.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/database/mysql/how-sql-executed-in-mysql.md b/docs/database/mysql/how-sql-executed-in-mysql.md index 13349f408b9..1452aef7aef 100644 --- a/docs/database/mysql/how-sql-executed-in-mysql.md +++ b/docs/database/mysql/how-sql-executed-in-mysql.md @@ -105,9 +105,10 @@ update tb_student A set A.age='19' where A.name=' 张三 '; 我们来给张三修改下年龄,在实际数据库肯定不会设置年龄这个字段的,不然要被技术负责人打的。其实这条语句也基本上会沿着上一个查询的流程走,只不过执行更新的时候肯定要记录日志啦,这就会引入日志模块了,MySQL 自带的日志模块是 **binlog(归档日志)** ,所有的存储引擎都可以使用,我们常用的 InnoDB 引擎还自带了一个日志模块 **redo log(重做日志)**,我们就以 InnoDB 模式下来探讨这个语句的执行流程。流程如下: -- 先查询到张三这一条数据,不会走查询缓存,因为更新语句会导致与该表相关的查询缓存失效。 +- 先查询到张三这一条数据,不会走查询缓存,因为查询缓存的设计规则就是只服务于查询类语句。 - 然后拿到查询的语句,把 age 改为 19,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。 -- 执行器收到通知后记录 binlog,然后调用引擎接口,提交 redo log 为提交状态。 +- 执行器收到通知后记录 binlog,然后清空该表的查询缓存。此时清空能保证后续的 SELECT 不会读到旧缓存 —— 因为事务马上就要最终提交,数据即将变成最新状态,缓存失效的时机刚好匹配数据的实际更新。 +- 执行器调用引擎接口 ,提交 redo log 为 commit 状态。 - 更新完成。 **这里肯定有同学会问,为什么要用两个日志模块,用一个日志模块不行吗?**