PolarDB MySQL 8.0:开启AHI时ePQ并行查询反而更慢的原因?
PolarDB ePQ与InnoDB自适应哈希索引(AHI)冲突问题分析
问题原因确认
你的猜测完全正确,AHI与ePQ并行查询确实会引发严重的latch竞争,直接导致你遇到的性能下降、CPU飙升问题:
- InnoDB的AHI默认采用分区式哈希索引设计,每个分区对应一个latch锁。当ePQ的多个工作线程同时访问同一个AHI分区时,会频繁触发latch的争抢与等待逻辑。
- 并行线程数越多(如你设置的
max_parallel_degree = 4),这种竞争越激烈,大量CPU时间会消耗在锁等待、上下文切换上,而非实际查询执行,最终出现并行效率低于串行的反常情况,同时RO节点CPU被占满。
处理建议
针对PolarDB for MySQL 8.0.2开启ePQ的场景,建议关闭AHI:
- 临时关闭(实例重启后失效):
SET GLOBAL innodb_adaptive_hash_index = OFF; - 永久关闭(需重启实例生效):
在实例配置文件中添加或修改:innodb_adaptive_hash_index = OFF - 效果验证:关闭AHI后,重新执行之前变慢的聚合查询,对比并行/串行执行耗时,同时监控RO节点的CPU使用率变化。
补充说明
- 并非所有场景下AHI都会与ePQ冲突,但对于高并发聚合类查询(尤其是频繁访问相同数据集的查询),AHI的latch竞争问题会被ePQ的并行执行放大。
- PolarDB后续版本针对该冲突有针对性优化,但在8.0.2版本中,关闭AHI是最直接有效的解决方式。
内容的提问来源于stack exchange,提问作者Kristen Lee
相关产品推荐
相关产品推荐

