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

【MySQL InnoDB 内核】Change Buffer 与 Adaptive Hash Index

文章导航

分类入口
databasekernel
标签入口
#mysql#innodb#change-buffer#insert-buffer#ahi#ibuf#btr0sea

目录

Change Buffer 与 Adaptive Hash Index

二级索引页不在 Buffer Pool 时,InnoDB 可把 INSERT/UPDATE/DELETE 索引变更 缓存在 Change Buffer(ibuf),待页读入再 merge——换写放大为延迟合并。另一套机制 AHI 在 B+Tree 之上建哈希捷径,命中则跳过树搜索;但维护哈希与 buffer latch 争用在高并发下常得不偿失,8.0 起 默认 innodb_adaptive_hash_index=OFF

本文基于 MySQL 8.0.36 ibuf/btr/btr0sea.cc,对照 B+Tree 篇


一、Change Buffer 适用条件

flowchart TD
  DML[二级索引变更] --> INBP{目标页在 BP?}
  INBP -->|是| DIRECT[直接修改索引页]
  INBP -->|否| IBUF[写入 Change Buffer]
  READ[读索引页] --> MERGE[ibuf merge 合并]

必须同时满足(简化):

聚簇索引 从不 走 Change Buffer——数据页必须即时定位。

源码:storage/innobase/ibuf/ibuf0ibuf.ccibuf_insert()ibuf_merge()


二、merge 触发时机

触发 说明
读页 buf_page_get 发现 ibuf 记录
后台 master thread / purge 协作
崩溃恢复 recv 后批量 merge

merge 本身消耗 CPU 与 IO——冷二级索引写密集 workload 可能换短峰值为长尾 merge。

监控:SHOW ENGINE INNODB STATUSINSERT BUFFER AND ADAPTIVE HASH INDEX 段(第 16 篇)。


三、innodb_change_buffering

行为
all insert/delete/mark/delete 等
none 关闭
inserts / deletes 部分操作

批量加载数据时可临时 none + 导入后重建索引——减少 merge 抖动(需本地验证)。


四、Adaptive Hash Index

AHI 为 频繁访问的 B+Tree 页(index_id, key_prefix) → rec 哈希。命中则 btr_search_guess_on_hash 直接定位记录。

关闭理由(8.0 默认 OFF)

何时考虑开启:读极度热点、索引浅、并发中等——必须 本地 benchmark,不可套用他方数据。

源码:storage/innobase/btr/btr0sea.cc


五、与 Buffer Pool 的交互

ibuf 本身占 专用页(space id 0),也缓存在 Buffer Pool。AHI 分区(innodb_adaptive_hash_index_parts,8.0)降低 latch 争用。


六、实验(需本地验证)

SHOW GLOBAL STATUS LIKE 'Innodb_ibuf%';
SHOW VARIABLES LIKE 'innodb_change_buffer%';
SHOW VARIABLES LIKE 'innodb_adaptive_hash_index%';

-- 冷二级索引批量 INSERT,对比 change_buffering=all vs none 的合并与 TPS

七、工程坑点

唯一索引批量加载走 ibuf——实际上不会;误以为 cb 加速唯一索引导入。

AHI ON 升级自 5.7 遗留配置。8.0 新装应验证是否仍需要。

忽略 merge 导致的读延迟尖刺。首次冷读可能触发大量 merge。


八、关键要点

  1. Change Buffer 只缓冲 非唯一二级索引 的延迟写。
  2. merge 在读盘与后台发生,是延迟代价的兑现。
  3. AHI 8.0 默认关闭;开启需证明热点收益 > latch 争用。
  4. 调优 cb 与 Buffer Pool 协同观察。

十一、PG 对照

维度 InnoDB PostgreSQL
延迟索引写 Change Buffer(仅二级索引) 无等价物;直接改索引页
内存哈希索引 AHI(页级) 无内置;可选扩展
合并时机 读页、purge、后台 N/A

PG 索引更新随 heap 更新即时落盘路径;InnoDB 聚簇不变、二级可延迟——这是 IOT 模型的副产品。


深度阅读清单

深度.1 ibuf_bitmap_pagestorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:ibuf bitmap。

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

深度.2 ibuf_merge_pagesstorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:批量 merge。

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

深度.3 btr_search_guess_on_hashstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:AHI 探测。

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

深度.4 btr_search_drop_page_hash_indexstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:AHI 失效。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:InnoDB 事务提交入口。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:InnoDB XA prepare。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:redo 写入 log buffer。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:redo 刷盘至指定 LSN。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:Buffer Pool 取页。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:记录锁 / gap lock。

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

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

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

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

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

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

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:AHI 构建。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:INNODB STATUS 输出。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:purge 回收 undo。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:崩溃恢复 redo apply。

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

深度.17 ha_commit_transsql/handler.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:Server 层事务提交。

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

深度.18 ordered_commitsql/binlog.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:binlog 组提交。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:binlog 事务落盘。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:索引读 handler 入口。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:索引扫描下一行。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:一致性读搜索。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:B+Tree 搜索。

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

深度.24 ibuf_bitmap_pagestorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:ibuf bitmap。

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

深度.25 ibuf_merge_pagesstorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:批量 merge。

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

深度.26 btr_search_guess_on_hashstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:AHI 探测。

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

深度.27 btr_search_drop_page_hash_indexstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:AHI 失效。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:InnoDB 事务提交入口。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:InnoDB XA prepare。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:redo 写入 log buffer。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:redo 刷盘至指定 LSN。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:Buffer Pool 取页。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:记录锁 / gap lock。

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

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

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

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

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

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

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:AHI 构建。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:INNODB STATUS 输出。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:purge 回收 undo。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:崩溃恢复 redo apply。

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

深度.40 ha_commit_transsql/handler.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:Server 层事务提交。

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

深度.41 ordered_commitsql/binlog.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:binlog 组提交。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:binlog 事务落盘。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:索引读 handler 入口。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:索引扫描下一行。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:一致性读搜索。

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

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

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:B+Tree 搜索。

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

深度.47 ibuf_bitmap_pagestorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:ibuf bitmap。

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

深度.48 ibuf_merge_pagesstorage/innobase/ibuf/ibuf0ibuf.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:批量 merge。

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

深度.49 btr_search_guess_on_hashstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:AHI 探测。

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

深度.50 btr_search_drop_page_hash_indexstorage/innobase/btr/btr0sea.cc

MySQL 8.0.36 中该符号与 Change Buffer 与 AHI 相关:AHI 失效。

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

专题深化 1:Change Buffer 与 AHI

InnoDB 的 Change Buffer 与 AHI 机制必须与 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:Change Buffer 与 AHI

InnoDB 的 Change Buffer 与 AHI 机制必须与 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:Change Buffer 与 AHI

InnoDB 的 Change Buffer 与 AHI 机制必须与 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:Change Buffer 与 AHI

InnoDB 的 Change Buffer 与 AHI 机制必须与 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:Change Buffer 与 AHI

InnoDB 的 Change Buffer 与 AHI 机制必须与 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:Change Buffer 与 AHI

InnoDB 的 Change Buffer 与 AHI 机制必须与 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:Change Buffer 与 AHI

InnoDB 的 Change Buffer 与 AHI 机制必须与 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 为准。

上一篇Optimizer 与 Handler

下一篇监控体系

参考资料

源码(MySQL 8.0.36)

官方文档

相关文章

同主题继续阅读

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


By .