代码 MySQL 9.7 社区版启用 hypergraph optimizer:默认关闭,sysbench 两个只读场景提升 26%/15%

2026-10-07 21:01:39

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 启动参数开启。

与经典优化器的区别

  1. 它把查询当作图来搜索,而不是把表当成一个接一个的 join 序列。
  2. nested-loop join 与 hash join 之间做真正基于代价的比较。经典优化器在存在可用索引时倾向于保持 nested-loop,即使整体上哈希表更便宜。
  3. 支持 bushy join plan。
  4. 成本模型基于测量和微基准进行校准。

早期 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。级联触发的触发器作为发起语句的一部分执行。触发器报错会导致该语句及其级联修改一起回滚。基于行的复制会记录触发器产生的更改,而不会在副本上重新执行这些触发器。

参考链接

复制全文 生成海报 MySQL 数据库 查询优化 Join 性能

推荐文章

程序员茄子在线接单