1. MySQL 8.0 自适应哈希索引的运行时构建?
MySQL 8.0 的自适应哈希索引(AHI)如何在运行时构建?由谁构建?代价与监控?
- AHI 由 InnoDB 运行时按访问模式自动构建,无需 DDL
- 只对等值点查有效,占用 buffer pool 内存
- 代价:内存、latch 争用与不可预测性;监控入口
自适应哈希索引(AHI)不是用户创建的索引,而是 InnoDB 在运行期根据观察到的访问模式自动构建:当存储引擎发现某些 B-Tree 页面被反复等值访问(如主键或二级索引的等值点查),会在内存中为这些页建立哈希索引项(键为索引键前缀,值为指向 B-Tree 页/记录的指针),后续点查直接从哈希表命中,跳过 B-Tree 的中间层遍历,减少 CPU 与锁等待。构建完全在运行时发生:由每页访问计数器驱动,无需 DDL 或人工干预,innodb_adaptive_hash_index=ON 时启用(8.0 默认 ON),并可用 innodb_adaptive_hash_index_parts 分区哈希表降低争用。
代价:① 占用 buffer pool 内存(哈希表本身);② 构建与维护有 CPU 与 latch 开销,高并发下可能成为争用热点(因此部分场景反而关闭它);③ 只对等值查询(=、IN)有效,范围/排序查询无收益。监控:SHOW ENGINE INNODB STATUS 中的 hash index 相关统计,或通过 performance_schema 观察;若热点等值查询无明显提升,可评估关闭并压测对比。
本题考察 AHI 的机制与代价:运行时自动构建、等值专用、内存与争用成本,以及"默认开启但需监控评估"的工程态度。