土法炼钢 · 系统与基础设施

【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 模型的副产品。


上一篇Optimizer 与 Handler

下一篇监控体系

参考资料

源码(MySQL 8.0.36)

官方文档

相关文章

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。


By .