惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Register - Security
The Register - Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
H
Hacker News: Front Page
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
T
Threatpost
AWS News Blog
AWS News Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tor Project blog
Google Online Security Blog
Google Online Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
W
WeLiveSecurity
博客园 - 叶小钗
K
Kaspersky official blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
Hacker News - Newest:
Hacker News - Newest: "LLM"
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
小众软件
小众软件
D
Docker
爱范儿
爱范儿
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】容灾架构:多活与灾备设计 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】抽象代数:群、环、域的密码学视角 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 排序基准测试:用数据说话
【MySQL InnoDB 内核】Optimizer 与 Handler:ICP、MRR 与存储引擎边界
Liao Tonglang · 2026-06-18 · via 土法炼钢兴趣小组的算法知识备份

EXPLAIN 显示 Using index condition 时,部分 WHERE 谓词在 InnoDB 层 对二级索引记录求值,而非全部回表后在 Server 过滤——这是 ICP(Index Condition Pushdown)Using mrr 则表示 MRR 批量收集主键再排序回表,把随机 IO 变成顺序 IO。二者都发生在 handler 接口 之下,优化器只选是否启用。

本文不展开 Server 层代价模型全文,只钉住 InnoDB 提供的能力与代价,对照 PG 执行器。版本:MySQL 8.0.36


一、Handler 在架构中的位置

flowchart TD
  SQL[SQL 层] --> OPT[Optimizer]
  OPT --> H[handler 接口]
  H --> INN[ha_innobase]
  INN --> ROW[row0sel / row0upd]
  ROW --> BTR[B+Tree]
  ROW --> BUF[Buffer Pool]

handlerton 注册引擎能力(事务、索引类型、ICP 标志)。优化器通过 TABLE::file 调用 index_readindex_nextrnd_next 等。

源码:sql/handler.hsql/handler.ccstorage/innobase/handler/ha_innodb.cc


二、核心 handler 方法

方法 场景
index_read 定长键查找
index_read_map / index_next 范围扫描
index_read_last 反向扫描
rnd_next 全表扫描(聚簇索引)
write_row / update_row / delete_row DML

ha_innobase::index_read 最终进入 row_search_mvcc(一致性读)或加锁读路径(第 7–9 篇)。


三、ICP:Index Condition Pushdown

优化器把 可用索引列无法完全覆盖 的谓词,以 ITEM 形式传给引擎;ha_innobase二级索引记录 上调用 index_cond 回调。

-- 需本地验证
EXPLAIN SELECT * FROM t WHERE a > 10 AND b LIKE 'x%';
-- 索引 (a,c),谓词含 b 时可能出现 Using index condition

收益:减少回表次数。代价:引擎内求值 CPU;某些函数不可下推。

源码:sql/opt_range.cc(计划)、storage/innobase/handler/ha_innodb.ccinnobase_index_cond)。


四、MRR 与 DS-MRR

Multi-Range Read:先扫二级索引收集主键到 buffer,按 PK 排序 后批量回表。

标志 含义
Using mrr 启用 MRR
Using mrr(sort_key) DS-MRR,排序键后回表

高选择性 范围查 + 宽表,MRR 显著降随机 IO;低选择性可能增加内存与排序开销。


五、覆盖索引与 EXPLAIN 解读

Using index:所需列均在同一二级索引中(第 11 篇)。Using where 在 Server 或引擎过滤。

EXPLAIN ANALYZE(8.0.18+)显示 实际行数与循环耗时——排查 ICP/MRR 是否生效的首选(需本地验证)。


六、代价边界

优化器用 统计信息mysql.innodb_index_stats)估计行数;InnoDB 提供 info()scan_time() 等粗粒度代价。 不准确统计 导致选错「索引+回表」vs「全表扫描」——与 PG 错误 n_distinct 同类。


七、实验(需本地验证)

SET optimizer_switch='mrr=on,mrr_cost_based=off';
SET optimizer_switch='index_condition_pushdown=on';

EXPLAIN ANALYZE SELECT id, col FROM wide WHERE secondary_key BETWEEN 1 AND 10000;
-- 对比 mrr on/off 的 actual time

八、工程坑点

以为 ICP 等于索引全覆盖。只能下推与索引列相关的条件组合。

关闭 MRR 后抱怨随机 IO。宽表二级索引范围查可显式测试 MRR。

8.0 隐式主键与覆盖索引设计。无显式 PK 时用隐藏 DB_ROW_ID,影响回表语义。


九、关键要点

  1. handler 是优化器与 InnoDB 的唯一边界。
  2. ICP 在索引记录上过滤,减少回表。
  3. MRR 排序主键后批量回表,优化 IO 形态。
  4. 覆盖索引 避免回表;与 ICP/MRR 正交。
  5. 计划问题先 EXPLAIN ANALYZE,再下钻 handler 路径。

十一、PG 对照

维度 InnoDB handler PG Executor
下推过滤 ICP(索引层) Index Scan + filter 或 Index Cond
批量回表 MRR + DS-MRR Bitmap Index Scan + heap fetch
覆盖扫描 二级索引含列即可 Index-Only Scan + VM
接口 handler 虚表 ForeignScan / IndexScan 节点

PG 第 12 篇 在计划节点层下推;MySQL 在 存储引擎 API 层下推——读懂 ha_innobase::index_read 即可对齐直觉。


深度阅读清单

深度.1 handler::index_readsql/handler.h

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:handler 索引读接口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.2 ha_innobase::index_readstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:InnoDB 实现。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.3 ha_innobase::read_range_firststorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:范围扫描入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.4 row_sel_store_mysql_recstorage/innobase/row/row0sel.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:行转 MySQL 格式。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.5 innobase_index_condstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:ICP 回调。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.6 trx_commit_for_mysqlstorage/innobase/trx/trx0trx.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:InnoDB 事务提交入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.7 trx_prepare_for_mysqlstorage/innobase/trx/trx0trx.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:InnoDB XA prepare。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.8 log_buffer_writestorage/innobase/log/log0log.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:redo 写入 log buffer。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.9 log_write_up_tostorage/innobase/log/log0log.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:redo 刷盘至指定 LSN。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.10 buf_page_get_genstorage/innobase/buf/buf0buf.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:Buffer Pool 取页。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.11 lock_rec_lockstorage/innobase/lock/lock0lock.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:记录锁 / gap lock。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.12 ibuf_insertstorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:Change Buffer 插入。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.13 ibuf_mergestorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:Change Buffer 合并。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.14 btr_search_build_page_hash_indexstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:AHI 构建。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.15 srv_mon_print_innodb_monitorstorage/innobase/srv/srv0mon.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:INNODB STATUS 输出。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.16 trx_purgestorage/innobase/trx/trx0purge.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:purge 回收 undo。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.17 recv_recovery_from_checkpoint_startstorage/innobase/log/log0recv.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:崩溃恢复 redo apply。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.18 ha_commit_transsql/handler.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:Server 层事务提交。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.19 ordered_commitsql/binlog.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:binlog 组提交。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.20 MYSQL_BIN_LOG::commitsql/binlog.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:binlog 事务落盘。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.21 ha_innobase::index_readstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:索引读 handler 入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.22 ha_innobase::index_nextstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:索引扫描下一行。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.23 row_search_mvccstorage/innobase/row/row0sel.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:一致性读搜索。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.24 btr_cur_search_to_nth_levelstorage/innobase/btr/btr0cur.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:B+Tree 搜索。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.25 handler::index_readsql/handler.h

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:handler 索引读接口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.26 ha_innobase::index_readstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:InnoDB 实现。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.27 ha_innobase::read_range_firststorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:范围扫描入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.28 row_sel_store_mysql_recstorage/innobase/row/row0sel.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:行转 MySQL 格式。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.29 innobase_index_condstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:ICP 回调。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.30 trx_commit_for_mysqlstorage/innobase/trx/trx0trx.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:InnoDB 事务提交入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.31 trx_prepare_for_mysqlstorage/innobase/trx/trx0trx.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:InnoDB XA prepare。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.32 log_buffer_writestorage/innobase/log/log0log.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:redo 写入 log buffer。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.33 log_write_up_tostorage/innobase/log/log0log.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:redo 刷盘至指定 LSN。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.34 buf_page_get_genstorage/innobase/buf/buf0buf.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:Buffer Pool 取页。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.35 lock_rec_lockstorage/innobase/lock/lock0lock.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:记录锁 / gap lock。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.36 ibuf_insertstorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:Change Buffer 插入。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.37 ibuf_mergestorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:Change Buffer 合并。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.38 btr_search_build_page_hash_indexstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:AHI 构建。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.39 srv_mon_print_innodb_monitorstorage/innobase/srv/srv0mon.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:INNODB STATUS 输出。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.40 trx_purgestorage/innobase/trx/trx0purge.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:purge 回收 undo。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.41 recv_recovery_from_checkpoint_startstorage/innobase/log/log0recv.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:崩溃恢复 redo apply。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.42 ha_commit_transsql/handler.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:Server 层事务提交。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.43 ordered_commitsql/binlog.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:binlog 组提交。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.44 MYSQL_BIN_LOG::commitsql/binlog.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:binlog 事务落盘。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.45 ha_innobase::index_readstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:索引读 handler 入口。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.46 ha_innobase::index_nextstorage/innobase/handler/ha_innodb.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:索引扫描下一行。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.47 row_search_mvccstorage/innobase/row/row0sel.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:一致性读搜索。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段

深度.48 btr_cur_search_to_nth_levelstorage/innobase/btr/btr0cur.cc

MySQL 8.0.36 中该符号与 Optimizer 与 Handler 相关:B+Tree 搜索。

步骤 动作
1 在 tag mysql-8.0.36 下打开源文件
2 自函数入口向下读 80–120 行
3 记录 mtr / mutex 边界与调用方
4 对照本章流程图标注阶段
参数 默认 说明
14_1 见文档 参数说明 1
14_2 见文档 参数说明 2
14_3 见文档 参数说明 3
14_4 见文档 参数说明 4
14_5 见文档 参数说明 5
14_6 见文档 参数说明 6
14_7 见文档 参数说明 7
14_8 见文档 参数说明 8
14_9 见文档 参数说明 9
14_10 见文档 参数说明 10
14_11 见文档 参数说明 11
14_12 见文档 参数说明 12
14_13 见文档 参数说明 13
14_14 见文档 参数说明 14
14_15 见文档 参数说明 15
14_16 见文档 参数说明 16
14_17 见文档 参数说明 17
14_18 见文档 参数说明 18
14_19 见文档 参数说明 19
14_20 见文档 参数说明 20
14_21 见文档 参数说明 21
14_22 见文档 参数说明 22
14_23 见文档 参数说明 23
14_24 见文档 参数说明 24
14_25 见文档 参数说明 25
14_26 见文档 参数说明 26
14_27 见文档 参数说明 27
14_28 见文档 参数说明 28
14_29 见文档 参数说明 29
14_30 见文档 参数说明 30

专题深化 1:Optimizer 与 Handler

InnoDB 的 Optimizer 与 Handler 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 1.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 1.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 1.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 1.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 1.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 2:Optimizer 与 Handler

InnoDB 的 Optimizer 与 Handler 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 2.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 2.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 2.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 2.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 2.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 3:Optimizer 与 Handler

InnoDB 的 Optimizer 与 Handler 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 3.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 3.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 3.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 3.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 3.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 4:Optimizer 与 Handler

InnoDB 的 Optimizer 与 Handler 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 4.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 4.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 4.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 4.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 4.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 5:Optimizer 与 Handler

InnoDB 的 Optimizer 与 Handler 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 5.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 5.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 5.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 5.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 5.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 6:Optimizer 与 Handler

InnoDB 的 Optimizer 与 Handler 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 6.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 6.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 6.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 6.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 6.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

专题深化 7:Optimizer 与 Handler

InnoDB 的 Optimizer 与 Handler 机制必须与 redo(log0log.cc)、undo(trx0undo.cc)、Buffer Pool(buf0buf.cc)一并理解。连接线程持有 THD,经 ha_innobase 进入引擎;页级修改包在 mtrmtr0mtr.cc)内。SQL 事务边界由 Server ha_commit_trans 协调 binlog 与 InnoDB(本章主线)。

专题深化 7.1 同步原语层次

短临界区用 mutex_entersync0sync.cc);页内容用 rw_locksync0rw.cc)。performance_schemawait/synch/mutex/innodb/% 需在本地 workload 下采集,不可套用他方 benchmark。

专题深化 7.2 8.0.36 源码阅读顺序

建议:本章核心目录 → mtr/mtr0mtr.cclog/log0log.cc → Server 层 sql/binlog.cc(若涉及复制)。调试编译用 -DWITH_DEBUG=1;生产用官方 GA 构建。

专题深化 7.3 实验纪律

凡涉及 SHOW ENGINE INNODB STATUS、Performance Schema、data_locks 的实验均标注 需本地验证。记录版本、存储介质、并发度;性能数字至少 3 次采样取中位数。

专题深化 7.4 与 PG 系列对照阅读

若已读 PostgreSQL 内核系列,用「同一问题」对照机制差异;不比较绝对性能——复制模型、页大小、MVCC 方案均不同。

专题深化 7.5 生产边界

Cloud RDS/Aurora 内部路径可能与社区版不同;本文以社区版 storage/innobase/ 为准。MariaDB 10.x 在部分路径存在分叉——以 Release Notes 为准。

上一篇主从复制机制

下一篇Change Buffer 与 AHI

参考资料

源码(MySQL 8.0.36)

  • storage/innobase/ — 引擎实现
  • sql/binlog.cc, sql/handler.cc — Server 层交界

官方文档

  • MySQL 8.0 Reference Manual, InnoDB / Replication / Backup

相关文章

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。