MySQL 8.0.19
mysql> show variables like 'innodb_parallel_read_threads';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| innodb_parallel_read_threads | 4 |
+------------------------------+-------+
1 row in set (0.00 sec)
从执行计划来看,尽管成本值很高,但它不会触发并行查询。
mysql> explain analyze SELECT count(a.name) FROM b,a WHERE b.id = a.id AND a.id < 10000\G
*************************** 1. row ***************************
EXPLAIN: -> Aggregate: count(a.`name`) (actual time=79199.970..79199.971 rows=1 loops=1)
-> Inner hash join (b.id = a.id) (cost=29804029261222.55 rows=29803521726988) (actual time=52129.791..79198.823 rows=9999 loops=1)
-> Table scan on b (cost=31.81 rows=18758239) (actual time=0.385..19630.712 rows=20000000 loops=1)
-> Hash
-> Filter: (a.id < 10000) (cost=4909601.51 rows=15888229) (actual time=2.266..52117.583 rows=9999 loops=1)
-> Table scan on a (cost=4909601.51 rows=47669458) (actual time=2.262..48985.413 rows=50000000 loops=1)
1 row in set (1 min 19.25 sec)
当前并行读取的用例非常有限。而documentation
innodb_parallel_read_threads
定义可用于并行聚集索引读取的线程数。从MySQL 8.0.17开始,支持并行扫描分区。并行读取线程可以提高CHECK TABLE性能。
有点含糊,feature documentation更详细地描述了当前用例:
FR1:从表T中选择COUNT(*);仅当扫描是非锁定扫描并且--innodb-parallel-read-threads> 1时,才会并行扫描索引。否则,它将回退到旧的逐行扫描。
FR2:CHECK TABLE T的第二阶段;也将进行并行扫描。
FR3:支持MVCC语义。
FR4:新的会话级变量--innodb-parallel-read-threads,用于控制用于并行SELECT COUNT(*)...的线程数;
- 最小值1
- 默认值4
- 最大值256。
NFR1:对于SELECT COUNT(*)FROM t,加速应为10倍;在相关的硬件(例如,tetra02)上。
简而言之:您应该只对select count(*) from table
有所改进(没有任何where
条款)。执行计划中也不会提及它,您目前只能通过将执行时间与innodb_parallel_read_threads
的不同值进行比较来查看效果。
[这是一个新功能,在目前的状态下基本上是laying the groundwork,用于将来的开发:
当前范围仅限于为DDL操作提供足够的基础结构以并行读取数据。现在,使CHECK TABLE的第二阶段并行是一个额外的好处。这样可以加快CHECK TABLE的速度。
开发人员将测试并逐步扩展此功能(例如,MySQL 8.0.17添加了对分区表的支持,并且似乎正在进行对二级索引的支持),但是可能需要一段时间,直到您的查询能够使用它。