在剛剛過去的 MySQL Summit 2025 大會上,Oracle 發布了一個用于 MySQL 的全新 Hypergraph(超圖)優化器,能夠為復雜的多表查詢生成更好的執行計劃,從而優化查詢性能。
這個功能目前只在 MySQL HeatWave 云數據庫中提供;MySQL 社區版如果想要支持的話,需要在源碼編譯安裝時啟用相關配置(-DWITH_DEBUG=1)。
以下是官方給出的一個性能測試結果:
接下來我們看兩個使用示例,首先啟用優化器配置:
MySQL > SET SESSION optimizer_switch='hypergraph_optimizer=on';
如果上面的語句沒有返回錯誤,表示成功啟用 Hypergraph 優化器。
然后比較以下查詢在使用傳統優化器和 Hypergraph 優化器時的區別:
MySQL > WITH salary_rank AS ( SELECT e.emp_no, e.first_name, e.last_name, d.dept_no, s.salary,RANK() OVER (PARTITION BY d.dept_no ORDER BY s.salary DESC) AS dept_rank FROM employees e JOIN dept_emp d ON e.emp_no = d.emp_no JOIN salaries s ON e.emp_no = s.emp_no WHERE s.to_date = '9999-01-01' AND d.to_date = '9999-01-01') SELECT * FROM salary_rank WHERE dept_rank = 1;
該查詢使用了 CTE 和窗口函數獲取每個部門中薪水最高的員工。
傳統優化器返回的結果如下:
+--------+------------+-----------+---------+--------+-----------+
| emp_no | first_name | last_name | dept_no | salary | dept_rank |
+--------+------------+-----------+---------+--------+-----------+
| 466852 | Akemi | Warwick | d001 | 145128 | 1 |
| 413137 | Lunjin | Swick | d002 | 142395 | 1 |
| 421835 | Yinlin | Flowers | d003 | 141953 | 1 |
| 430504 | Youjian | Cronau | d004 | 138273 | 1 |
| 13386 | Khosrow | Sgarro | d005 | 144434 | 1 |
| 472905 | Shin | Luck | d006 | 132103 | 1 |
| 43624 | Tokuyasu | Pesch | d007 | 158220 | 1 |
| 425731 | Ramachenga | Soicher | d008 | 130211 | 1 |
| 18006 | Vidya | Hanabata | d009 | 144866 | 1 |
+--------+------------+-----------+---------+--------+-----------+
9 rows in set (2.1155 sec)
Hypergraph 優化器返回的結果如下:
+--------+------------+-----------+---------+--------+-----------+
| emp_no | first_name | last_name | dept_no | salary | dept_rank |
+--------+------------+-----------+---------+--------+-----------+
| 466852 | Akemi | Warwick | d001 | 145128 | 1 |
| 413137 | Lunjin | Swick | d002 | 142395 | 1 |
| 421835 | Yinlin | Flowers | d003 | 141953 | 1 |
| 430504 | Youjian | Cronau | d004 | 138273 | 1 |
| 13386 | Khosrow | Sgarro | d005 | 144434 | 1 |
| 472905 | Shin | Luck | d006 | 132103 | 1 |
| 43624 | Tokuyasu | Pesch | d007 | 158220 | 1 |
| 425731 | Ramachenga | Soicher | d008 | 130211 | 1 |
| 18006 | Vidya | Hanabata | d009 | 144866 | 1 |
+--------+------------+-----------+---------+--------+-----------+
9 rows in set (1.6108 sec)
查詢結果一致,但是 Hypergraph 優化器速度更快。
接下來比較一下 EXPLAIN 語句針對兩種優化器返回的執行計劃,注意 Hypergraph 優化器只支持 TREE 或者 JSON 格式。
首先是傳統優化器:
然后是 Hypergraph 優化器:
雖然 Hypergraph 優化器顯示的最終成本更高,但是由于它們采用的計算模型不同,實際上比較不同優化器的成本沒有任何意義。
我們能夠看到傳統優化器采用了 Nested Loop Inner Join 方式連接兩個表,Hypergraph 優化器則采用了 Inner Hash Join 方式,后者獲得了更好的查詢性能。
期待一下 MySQL 全系產品支持 Hypergraph 優化器,正式進軍 OLAP 領域!