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 级打开试一条,再决定是否推广到全局。会话级的好处是影响面只有当前连接,测完断开即恢复。
验证步骤
- 挑一条已知的慢 SQL,不要拿整库跑对比。
- 同一会话里先看原计划:
EXPLAIN ;
EXPLAIN ANALYZE ;
- 打开开关后再执行一次:
SET optimizer_switch='hypergraph_optimizer=on';
EXPLAIN ;
EXPLAIN ANALYZE ;
- 记录两次的实际耗时和计划差异(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 的解读: