这是《MySQL 8.0 源码与内核实战》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 社区 MySQL 8.0 对并行查询的支持有限,聚集计算和多数单条 SELECT 仍以单线程执行为主。并行读取更多出现在发行版、HeatWave 或分析引擎中。本章重点是理解并行模型与瓶颈。
27.1 串行执行
one worker
-> read rows
-> filter
-> aggregate
-> sort
-> return
瓶颈可能:
- CPU 单核;
- Buffer Pool latch;
- B+Tree 并发;
- IO;
- 排序;
- 网络发送;
- 行解析。
27.2 并行扫描模型
coordinator
-> split ranges / pages
-> workers
-> partial aggregation
-> merge
适合:
- 大范围扫描;
- 少量复杂聚合;
- 只读分析;
- 数据分布均匀;
- IO 能力充足。
不适合:
- 点查;
- 小结果集;
- 强锁读;
- 高并发 OLTP;
- 更新和事务冲突明显。
27.3 并行聚合
SELECT status, COUNT(*), SUM(amount)
FROM orders
WHERE created_at >= '2026-01-01'
GROUP BY status;
模型:
workers compute partial results
-> coordinator merge by group key
难点:
- DISTINCT;
- 窗口函数;
- 排序语义;
- 精度;
- 分组倾斜;
- 内存控制。
27.4 MySQL 生态差异
| 方案 | 特点 |
|---|---|
| 社区 8.0 | 并行查询能力有限 |
| HeatWave | 推送到分析加速层 |
| Percona / PolarDB 等 | 发行版可能提供并行查询 |
| ClickHouse / Doris | 面向分析的原生并行 |
同一条 SQL 的并行行为不能跨实现假设。
27.5 观测
EXPLAIN ANALYZE SELECT ...;
SELECT * FROM performance_schema.threads WHERE type='foreground';
SHOW PROCESSLIST;
并行执行要观测:
- worker 数;
- 每个分区扫描行数;
- merge 时间;
- 内存;
- p95/p99;
- 对 OLTP 干扰。
27.6 生产判断
是否并行应考虑:
- 查询频率;
- 扫描量;
- SLA;
- CPU 水位;
- IO 延迟;
- 并发事务;
- 缓存命中率;
- 是否可路由分析库。
本章小结
社区 MySQL 8.0 不是通用 MPP 数据库,复杂分析应考虑专用链路。并行查询的收益来自大扫描和聚合,代价是 CPU、内存和调度干扰。
思考题
- 哪些 OLTP 点查不适合并行?
- 并行聚合如何合并部分结果?
- 为什么 DISTINCT 和窗口函数更难并行?
- 如何评估并行查询对在线事务的干扰?
- 社区版与发行版能力为什么不能混为一谈?