已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
MySQL 8.0.36(InnoDB,16C64G,buffer_pool 48G),核心表 t_order 约 2 亿行,主键 id(bigint 自增)。业务是高频点查 + 点更新(按 PK),QPS 约 8k,隔离级别 RC。
performance_schema.events_waits_summary_global_by_event_name 出现 wait/synch/cond/rw-lock/btr_search_latch(InnoDB AHI 内部 latch)等待量从正常的 <500 飙到 200k+;SHOW STATUS LIKE 'Innodb_adaptive_hash%' 显示 hit rate ≈ 78%,看起来"健康",但飙升时刻 Innodb_adaptive_hash_hits 增量反而下降、Innodb_adaptive_hash_misses 增量上升——怀疑是 AHI 在高频更新后触发内部 rebuild,rebuild 期间 latch 争用放大;SET GLOBAL innodb_adaptive_hash_index=OFF → P99 立刻稳定到 3~5ms,但 P50 从 1.2ms 涨到 1.8ms(多走了一次 B-tree 查找的 I/O 路径),整体吞吐降约 8%;SET GLOBAL innodb_adaptive_hash_index_parts=32(默认 8)→ P99 峰值从 50ms 降到 35ms,P50 基本不变,但没有根治,还是周期性抖;innodb_buffer_pool_instances 从 8 到 16 → 无显著变化;SHOW ENGINE INNODB STATUS 的 ADAPTIVE HASH INDEX 段:hash table size 约 4M entries,number of buckets 随 parts 变化,但没有暴露 rebuild 次数或 latch 等待时长分布;perf record -g -p <mysqld_pid> 抓了 30s 火焰图:飙升窗口内 btr_search → btr_search_latch_wait 占比从 2% 涨到 18%,确认是 AHI 内部争用而非 buffer pool 的 buf_LRU_list_mutex。perf 火焰图,有没有更轻量的手段(比如 performance_schema 里哪些表/事件能直接量化 btr_search_latch 的等待分布)?Innodb_adaptive_hash_hits/misses 在 rebuild 期间的行为有没有文档化的解释?innodb_adaptive_hash_index_parts 的调优边界:parts 越大 latch 争用越小,但每个 part 的 hash table 越小、miss 率越高——这个 tradeoff 的"最优点"有没有经验公式或压测方法?我试了 8/16/32/64,32 最好但 64 反而 P50 又涨了,想理解背后的机制。innodb_flush_log_at_trx_commit=1,sync_binlog=1,隔离级别 READ COMMITTED。