如何触发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并行查询功能启动?的主要内容,如果未能解决你的问题,请参考以下文章

异常消息: 查询处理器未能为执行并行查询启动必要的线程资源。

WINFORM 启动器(并行exe)设计方案

如何设置让MYSQL数据库,可以令其不会随电脑自行启动?

创建新文件夹或文件时如何触发 Windows 服务启动

MySQL-触发器

如何重新启动失败的 Google Apps 脚本触发器?