MySQL 9.7 社区版启用 hypergraph optimizer:默认关闭,sysbench 两个只读场景提升 26%/15%
Oracle 博客 2026 年 4 月 27 日消息,MySQL 9.7 社区版开始包含 hypergraph optimizer,作为经典 join optimizer 的替代方案,该能力现已覆盖所有 MySQL 版本。它使用新的 join 规划框架,主要面向 plan shape 会显著影响执行代价的场景:多表 join、多种 join 方法互相竞争的查询,以及计划前一部分产生的行顺序会影响后续操作代价的情况。
启用方式
hypergraph optimizer 在 MySQL 9.7 社区版中默认不启用。
SET optimizer_switch='hypergraph_optimizer=on';
也可以在单条语句上通过 hint 启用:
SELECT /*+ SET_VAR(optimizer_switch='hypergraph_optimizer=on') */ ...;
同样支持在 global/persisted 作用域设置,或通过 mysqld --optimizer-switch 启动参数开启。
与经典优化器的区别
- 它把查询当作图来搜索,而不是把表当成一个接一个的 join 序列。
- nested-loop join 与 hash join 之间做真正基于代价的比较。经典优化器在存在可用索引时倾向于保持 nested-loop,即使整体上哈希表更便宜。
- 支持 bushy join plan。
- 成本模型基于测量和微基准进行校准。
早期 sysbench 结果
在 MySQL 9.7.0 的公开 sysbench 测试中,Mark Callaghan 报告启用 hypergraph optimizer 后:
read-only-distinct提升 26%;read-only_range=10000提升 15%。
后续方向与已知不足
后续计划包括:更好地处理 interesting orders,对 nested-loop 与 hash join 做基于代价的比较,支持 bushy join plan,并让成本模型与实测执行成本对齐。
仍需继续改进的地方包括:基表过滤条件的选择率估计、join 结果的基数估计,以及经典优化器仍可能找到更优计划的回归场景。尤其在行数估计不准确时,经典优化器仍可能选出更好的计划。官方欢迎反馈,提交 bug report 时请附可复现的测试用例、schema、索引以及 EXPLAIN ANALYZE 输出。
同版本另一个变量:enable_cascade_triggers
MySQL 9.7.0(2026-04-21)还引入了新变量 enable_cascade_triggers。SQL 层外键处理执行的 CASCADE 和 SET NULL 操作,现在可以激活受影响子行上的 BEFORE 和 AFTER 触发器。
按会话启用:
SET enable_cascade_triggers = ON;
默认值为 OFF。级联触发的触发器作为发起语句的一部分执行。触发器报错会导致该语句及其级联修改一起回滚。基于行的复制会记录触发器产生的更改,而不会在副本上重新执行这些触发器。