如何触发Mysql并行查询功能启动?
Posted
技术标签:
【中文标题】如何触发Mysql并行查询功能启动?【英文标题】:How to trigger Mysql parallel query function to start? 【发布时间】:2020-02-22 03:53:49 【问题描述】: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)
【问题讨论】:
【参考方案1】:并行读取的当前用例非常有限。而documentation
innodb_parallel_read_threads
定义可用于并行聚集索引读取的线程数。从 MySQL 8.0.17 开始支持分区的并行扫描。并行读取线程可以提高 CHECK TABLE 性能。
有点模糊,feature documentation 更详细地描述了当前的用例:
FR1:从表 T 中选择计数(*);仅当扫描是非锁定扫描并且 --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 增加了对分区表的支持,并且对二级索引的支持似乎正在进行中),但您的查询可能需要一段时间才能完成可以使用。
【讨论】:
@Solaflare,感谢您的细心回答。经过我自己的测试,我也发现当并行度确实提高了的时候,查询时间会适当减少,但是不会显示在执行计划中。以上是关于如何触发Mysql并行查询功能启动?的主要内容,如果未能解决你的问题,请参考以下文章