编程 MySQL 9.7.0 LTS 把 Hypergraph Optimizer 下放到社区版:慢的多表 JOIN 报表可以先在会话级试

2026-11-09 21:08:09

MySQL 9.7.0 LTS 把 Hypergraph Optimizer 下放到社区版:慢的多表 JOIN 报表可以先在会话级试

MySQL 9.7.0 LTS(2026-04-21)里,Hypergraph Optimizer 从 Enterprise/HeatWave 进入 Community Edition。此前这套优化器只在商业版提供。

传统优化器与 Hypergraph 的区别

传统优化器按 left-deep tree 枚举 join 顺序,两三个表够用,但复杂多表 join 容易漏掉更优执行计划。Hypergraph Optimizer 把整个查询建模成超图(hypergraph),用动态规划在更大的计划空间里搜索。

开关写法

SET optimizer_switch='hypergraph_optimizer=on';

作用范围可以是 session、global、persist,也可以对单条查询加 hint。建议先在真实慢查询上按 session 级打开试一条,再决定是否推广到全局。会话级的好处是影响面只有当前连接,测完断开即恢复。

验证步骤

  1. 挑一条已知的慢 SQL,不要拿整库跑对比。
  2. 同一会话里先看原计划:
EXPLAIN ;
EXPLAIN ANALYZE ;
  1. 打开开关后再执行一次:
SET optimizer_switch='hypergraph_optimizer=on';
EXPLAIN ;
EXPLAIN ANALYZE ;
  1. 记录两次的实际耗时和计划差异(join 顺序、访问方式是否变化),只以 EXPLAIN ANALYZE 的实际执行数据为准。

适用边界

只对 join 多的分析型查询有意义。简单两表 join、OLTP 点查这类查询,传统优化器已经给出足够好的计划,打开开关没有收益。

风险

计划变化是双向的:原本跑得快的查询可能因为换了计划而变慢。所以先在会话级试点,确认单条语句收益后再按 statement 范围逐步推进,不要一上来就改全局或持久化配置。

采样对比流程

可以用 shell 包一层,对同一条 SQL 做前后对比:

SQL="SELECT ... FROM a JOIN b JOIN c JOIN d WHERE ..."

mysql -N -e "EXPLAIN ANALYZE $SQL" testdb > plan_before.txt
mysql -N -e "EXPLAIN ANALYZE $SQL" testdb > /dev/null   # 预热

for i in 1 2 3; do
mysql -N -e "
SET optimizer_switch='hypergraph_optimizer=off';
EXPLAIN ANALYZE $SQL;" testdb
done

for i in 1 2 3; do
mysql -N -e "
SET optimizer_switch='hypergraph_optimizer=on';
EXPLAIN ANALYZE $SQL;" testdb
done

每次都在独立连接里设置 session 级开关,避免状态串到别的测试上;把输出里的 actual time 和 rows 逐条对齐看。

版本选择

MySQL 8.0.46 是 8.0 的最后一个版本,8.0 已于 2026 年 4 月 EOL,官方建议升级到 8.4 LTS 或 9.7。注意 9.7.0 本身带有较高危 CVE,Percona 直接跳过 9.7.0、发布 9.7.1,升级时应从 9.7.1 及之后版本起步。

9.7 同时进入 Community 的能力还包括:复制监控组件、Group Replication 流控统计、资源管理器、主选举组件、Telemetry(OpenTelemetry/OTLP),以及 JSON Duality Views 的 DML 支持。

参考

  • MySQL 9.7 手册:
  • MySQL 9.7.0 LTS 发布说明:
  • Percona 对 9.7 LTS 的解读:
复制全文 生成海报 MySQL 查询优化 JOIN 版本升级

推荐文章

程序员茄子在线接单