资讯 MySQL 9.7.0 两处 InnoDB 修复:统计为空时丢索引路径,并行扫描回退踩断言

2026-09-30 21:03:31

MySQL 9.7.0 两处 InnoDB 修复:统计为空时丢索引路径,并行扫描回退踩断言

MySQL 9.7.0 于 2026-04-21 发布(LTS)。InnoDB 有两处值得注意的修复,共同特征是「计划/行为不对,但看起来没坏」——一个让大表悄悄走到次优计划,一个在错误日志里留下断言。

  • 发布说明:https://dev.mysql.com/doc/relnotes/mysql/9.7/en/news-9-7-0.html
  • 仓库:https://github.com/mysql/mysql-server

一、Bug #33472935:dict_stats_analyze_index() 丢弃最优索引访问路径

dict_stats_analyze_index() 可能丢弃最优的基于索引的访问路径,导致大表性能次优。触发条件有两条:

  • 空索引统计被并发读到;
  • 某次错误导致索引统计为空。

致谢 Casa Zang 与腾讯团队贡献。

这类问题的麻烦之处在于执行计划退化不报错,SQL 照常返回结果,只是变慢。可验证的排查手法:

1)确认统计是否为空或缺失。 CARDINALITY 为 NULL、或与实际行数明显偏离,都是可疑信号:

SELECT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX,
       COLUMN_NAME, CARDINALITY
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'your_db'
  AND TABLE_NAME = 'your_table'
ORDER BY INDEX_NAME, SEQ_IN_INDEX;

2)与执行计划对照。 用 EXPLAIN / EXPLAIN ANALYZE 看实际选中的访问路径;如果统计为空的那条索引,恰好就是被放弃的路径,方向基本对上。

3)重新收集统计后再对比一次计划。

ANALYZE TABLE your_db.your_table;

需要说明的是:ANALYZE TABLE 是重新收集统计,不是修复手段。如果「空统计被并发读到」的窗口仍然存在,重收集之后仍可能复现。

4)复现窗口。 触发要同时具备并发统计读取与统计为空两个条件,压测时把统计收集和查询叠在一起跑,命中概率更高。

相关改动集中在 storage/innobase/handler/ha_innodb.cc(mysql-server 仓库提交,WL#16999)。

二、Bug #38325137:并行扫描回退单线程时断言失败

InnoDB 创建并行扫描线程可能失败,回退到单线程模式时触发断言失败,返回的错误形如:

Assertion failure: row0pread.h:306:active >= n_threads

排查顺序建议从 error log 入手:

  • 直接 grep 断言位置:row0pread.h:306 与 active >= n_threads。先把 error log 的时间戳和业务侧报错的时间对齐,确认是 mysqld 崩溃重启,还是仅打印了断言信息。
  • 线程创建失败通常与资源压力相关:线程数上限、内存、cgroup 限制等。回退路径只有在线程创建失败时才会走到,因此这条断言常出现在高并发叠加资源紧张的时间段。
  • 用 performance_schema 还原当时的负载:performance_schema.threads、events_statements_summary_by_thread_by_event_name,或直接看连接数/线程数曲线,判断线程资源是否被打满。
  • 具体到配置侧,核对 max_connections、线程池与 OS 线程上限、容器内 pids 限制;若能稳定复现,把并行度和实际可用线程数一起记录下来。

三、Thread Pool:高负载下连接挂起(Bug #38693319)

Thread Pool Notes 中提到:高负载下使用 Thread Pool 时,连接可能挂起(Bug #38693319)。这个特征不好抓——连接不断、语句不报错,只是长时间不动。排查时看连接状态与线程池相关指标(performance_schema 中 thread pool 相关表、连接数曲线),并与 error log 时间戳对齐。

四、代码位置与文档

  • InnoDB 统计相关改动集中在 storage/innobase/handler/ha_innodb.cc(mysql-server 仓库提交,WL#16999)
  • MySQL 9.7 Reference Manual 的 “What Is New in MySQL 9.7”
  • 发布说明:https://dev.mysql.com/doc/relnotes/mysql/9.7/en/news-9-7-0.html
  • 仓库:https://github.com/mysql/mysql-server
复制全文 生成海报 MySQL 数据库 性能

推荐文章

程序员茄子在线接单