EXPLAIN FORMAT=TREE是唯一可信验证方式,仅当输出首行为“-> Parallel scan on table_name”才表示并行真正启用;其他格式或字段如"parallel_table_scan": true仅说明优化器考虑过该路径。

EXPLAIN FORMAT=TREE 是唯一可信的验证方式
看到 EXPLAIN 或 EXPLAIN FORMAT=JSON 输出里有 "parallel_table_scan": true,不代表并行真在跑——这只是优化器“考虑过”并行路径,最终可能静默降级。只有 EXPLAIN FORMAT=TREE 的输出中明确出现 -> Parallel scan on table_name,才表示 InnoDB 层已实际调度并行读线程。
常见误判场景包括:
- 执行计划里带
Using index(覆盖索引),哪怕表很大,也不会触发物理页读,innodb_parallel_read_threads完全不参与 - 语句含
LIMIT、ORDER BY、GROUP BY、DISTINCT、子查询或 CTE,优化器直接跳过并行候选路径 - 表是分区表、临时表、MyISAM 或 Memory 引擎,参数设得再高也无效
parallel_query 必须显式设为 ON
MySQL 8.0.30+ 中,并行查询是实验性功能,默认关闭。仅设置 innodb_parallel_read_threads > 0 毫无意义——它只是资源准备,不是开关。
必须同时满足:
-
SET GLOBAL parallel_query = ON(影响新连接)或写入my.cnf的[mysqld]段 -
parallel_threads_limit设为 2–4(不是 CPU 核数!设太高反而因调度开销拖慢) -
innodb_parallel_read_threads ≥ parallel_threads_limit - 1(例如parallel_threads_limit = 3时,至少设innodb_parallel_read_threads = 2)
注意:SET GLOBAL 不影响已存在的会话,需重新连接或用 SET SESSION 单独设置。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
扫描路径必须满足物理页读取条件
并行只发生在 InnoDB 存储引擎的物理页读取层,不作用于逻辑计划或缓存命中路径。以下情况必然绕过并行:
- WHERE 条件能走索引(哪怕只是部分命中),就会退回到索引查找,不会触发全表扫描路径
- 查询预估行数太少(通常
- 事务隔离级别为
REPEATABLE READ且存在 gap lock,InnoDB 为保证一致性会静默禁用并行 - 同一张表正被另一事务持有 X lock(如未提交的 INSERT/UPDATE),并行读会被阻塞并降级
可检查 EXPLAIN FORMAT=TREE 最外层节点是否为 Table scan 或 Range scan,且 Extra 字段不含 Using index。
硬件与负载限制常被忽略
即使所有配置和 SQL 都合规,并行也可能因底层资源瓶颈失效:
- HDD 场景下设
innodb_parallel_read_threads > 4,磁头争抢加剧,延迟反升;SSD 场景建议从 4 开始,逐步试到 12,超过 32 基本无收益 - CPU 使用率持续 > 90% 或 buffer pool mutex 竞争高时,强行启用多线程会放大锁争用,
SHOW ENGINE INNODB STATUS可能出现InnoDB: Warning: parallel read threads exceed available CPU - 若查询瓶颈不在
handler_read_rnd_next(随机页读),而在网络传输、解析或排序阶段,调这个参数毫无意义
真正起效的前提,是确认该查询的 I/O 瓶颈集中在大范围物理页读取,且系统尚有余量承接额外线程调度。

















