mysql8并行查询_并行查询(Parallel Query)

本文介绍了如何通过Hint语法在MySQL8中控制并行查询,包括开启、关闭并行查询以及指定并行度。示例展示了如何对单个SQL语句进行并行度设置,以及对特定表和子查询的并行控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过Hint来控制并行查询

使用Hint语法可以对单个语句进行控制,例如系统默认关闭并行查询情况下,但需要对某个高频的慢SQL查询进行加速,此时就可以使用Hint对特定SQL进行加速。

您可以使用如下任意一种方式开启并行查询:SELECT /*+PARALLEL(x)*/ ... FROM ...; -- x >0

SELECT /*+ SET_VAR(max_parallel_degree=n) */ * FROM ... // n > 0

您可以使用如下任意一种方式关闭并行查询:SELECT /*+NO_PARALLEL()*/ ... FROM ...;

SELECT /*+ SET_VAR(max_parallel_degree=0) */ * FROM ...

Hint高级用法

并行查询提供了PARALLEL和NO_PARALLEL两种Hint。

通过PARALLEL Hint可以强制查询并行执行,同时可以指定并行度和并行扫描的表。

通过NO_PARALLEL Hint可以强制查询串行执行,或者指定不选择某些表作为并行扫描的表。

Hint语法如下所示:/*+ PARALLEL [( [query_block] [table_name] [degree] )] */

/*+ NO_PARALLEL [( [query_block] [table_name][, table_name] )] */

其中参数说明如下所示。

参数

说明

query_block

应用Hint的query block名称。

table_name

应用Hint的表名称。

degree

并行度。

示例:SELECT /*+PARALLEL()*/ * FROM t1, t2;

-- 当表记录数小于records_threshold_for_parallelism设置的行数 ( 默认10000行)时,会强制并行,

-- 并行度用系统默认max_parallel_degree, 如果max_parallel_degree > 0,

-- 则打开并行,如果max_parallel_degree等于0时,依旧时关闭并行。

SELECT /*+PARALLEL(8)*/ * FROM t1, t2;

-- 强制并行度8并行执行,

-- 当表记录数小于records_threshold_for_parallelism设置的行数 ( 默认10000行)时,会强制并行,

-- 并行度设置max_parallel_degree为8。

SELECT /*+ SET_VAR(max_parallel_degree=8) */ * FROM ...

-- 设置并行度max_parallel_degree为8,

-- 当表记录数小于records_threshold_for_parallelism设置的行数(如20000行)时,会自动关闭并行。

SELECT /*+PARALLEL(t1)*/ * FROM t1, t2;

-- 选择t1表并行, 对t1表执行/*+PARALLEL()*/ 语法

SELECT /*+PARALLEL(t1 8)*/ * FROM t1, t2;

-- 强制并行度8且选择t1表并行执行, 对t1表执行/*+PARALLEL(8)*/语法

SELECT /*+PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a =

(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);

--强制subquery并行执行, 并行度用系统默认max_parallel_degree,

-- 如果max_parallel_degree > 0, 则打开并行,max_parallel_degree等于0时,依旧时关闭并行

SELECT /*+PARALLEL(@subq1 8)*/ SUM(t.a) FROM t WHERE t.a =

(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);

--强制subquery并行执行, 并行度设置max_parallel_degree为8

SELECT SUM(t.a) FROM t WHERE t.a =

(SELECT /*+PARALLEL()*/ SUM(t1.a) FROM t1);

--强制subquery并行执行,

-- 并行度用系统默认max_parallel_degree,

-- 如果max_parallel_degree > 0, 则打开并行,max_parallel_degree等于0时,依旧时关闭并行

SELECT SUM(t.a) FROM t WHERE t.a =

(SELECT /*+PARALLEL(8)*/ SUM(t1.a) FROM t1);

--强制subquery并行执行, 设置并行度max_parallel_degree为8

SELECT /*+NO_PARALLEL()*/ * FROM t1, t2;

-- 禁止并行执行

SELECT /*+NO_PARALLEL(t1)*/ * FROM t1, t2;

-- 只对t1表禁止并行, 当系统打开并行时, 有可能对t2进行并行扫描,并行执行

SELECT /*+NO_PARALLEL(t1, t2)*/ * FROM t1, t2;

-- 同时对t1和t2表禁止并行

SELECT /*+NO_PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a =

(SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);

--禁止subquery 并行执行

SELECT SUM(t.a) FROM t WHERE t.a =

(SELECT /*+NO_PARALLEL()*/ SUM(t1.a) FROM t1);

--禁止subquery 并行执行

说明 对于不支持并行的查询或者并行扫描的表,PARALLEL Hint不生效。

并行子查询的选择方式(并行子查询详细信息请参见/*+ PQ_PUSHDOWN [( [query_block])] */ 对应的子查询会选择push down的并行子查询执行策略

/*+ NO_PQ_PUSHDOWN [( [query_block])] */ 对应的子查询会选择shared access的并行子查询执行策略

示例:#子查询选择push down并行策略

EXPLAIN SELECT /*+ PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =

(SELECT /*+ qb_name(qb1) */ a FROM t1);

#子查询选择shared access并行策略

EXPLAIN SELECT /*+ NO_PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =

(SELECT /*+ qb_name(qb1) */ a FROM t1);

#不加query block进行控制

EXPLAIN SELECT * FROM t2 WHERE t2.a =

(SELECT /*+ NO_PQ_PUSHDOWN() */ a FROM t1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值