并行刷新

更新时间:
复制为 MD 格式

PolarDB MySQL物化视图的全量刷新(Complete Refresh)和增量刷新的首次刷新,支持 ETL 并行写入和 ePQ 并行写入两种模式,您可以根据宽窄表、集群系列(集群版/多主集群)、是否需要计算卸载等场景特征选择合适的并行写入模式,以提升刷新执行效率。

概述

PolarDB MySQL物化视图的全量刷新(Complete Refresh)和增量刷新的首次刷新,支持以下两种并行写入模式来提高执行效率:

模式

开关

架构

适用场景

ETL 并行写入(默认)

默认模式(并行度 > 1 时自动启用)

查询卸载到远程节点执行,多 Worker 并行消费结果写入。

宽表、大数据量、需要计算卸载。

ePQ 并行写入

需手动切换

PQ 框架将INSERT SELECT拆分为多 Worker 并行执行,支持 MPP 卸载。

窄表、需要端到端并行。

两种模式均要求 materialized_view_refresh_parallelism > 1 才生效。

适用范围

版本

支持的并行刷新模式

备注

MySQL 8.0.1,内核小版本为8.0.1.1.54及以上版本

ETL 模式

仅支持 ETL-based 并行刷新。

MySQL 8.0.2,内核小版本为8.0.2.2.348.0.2.2.35

ePQ 模式

  • 仅支持 ePQ 模式

  • 与分区 MDL 功能暂不兼容,隐式分区开启时 partition_level_mdl 必须关闭。

刷新流程

物化视图完全刷新分为三个阶段:

  1. 创建容器表:根据物化视图定义创建新容器表。若materialized_view_implicit_partition_num > 1,自动添加 HASH 分区,消除并行写入时的锁竞争。

    说明

    MySQL 8.0.1版本暂不支持materialized_view_implicit_partition_num参数。

  2. 并行数据写入:根据所选模式执行并行写入。

  3. 构建列存索引(可选):若 materialized_view_add_columnar_index_after_insert = ON,先完成刷新,然后再为容器表构建列存索引(IMCI)。

ETL 并行写入模式

工作原理

  1. 根据卸载策略选择远程节点(列存索引只读节点或行存只读节点),建立连接。

  2. 将物化视图的定义查询发送到远程节点执行。

  3. 远程节点流式返回结果集(支持压缩传输)。

  4. 主(RW)节点创建多个 Worker 线程,各 Worker 并行获取行并写入容器表各分区。

特性

  • 查询计算在远程节点完成,不占用主(RW)节点CPU。

  • 写入在主(RW)节点本地执行,保证事务一致性。

  • 宽表场景下并行效率不受行长影响。

  • 支持多主集群(Limitless)

使用步骤

PolarDB集群参数在控制台与会话中修改方式存在差异,详细区别如下:

  • PolarDB控制台上修改

    • 兼容性说明:部分集群参数在PolarDB控制台上均已添加MySQL配置文件的兼容性前缀loose_

    • 操作方法:找到并修改这些带loose_前缀的参数。

  • 在数据库会话中修改(使用命令行或客户端):

    • 操作方法:当您连接到数据库,使用SET命令修改参数时,请去掉loose_前缀,直接使用参数的原始名称进行修改。

参数

示例值

可否 SESSION 设置

说明

materialized_view_refresh_parallelism

16

设置并行度(大于1时,启用并行刷新)。

materialized_view_complete_refresh_offload_policy

FORCE_IMCI

手动刷新时可按会话指定不同卸载策略。

上述参数配置完成后,执行刷新:

-- 执行刷新
REFRESH MATERIALIZED VIEW <schema_name>.<mview_name>;

ePQ 并行写入模式

工作原理(MPP 卸载到远程列存索引只读节点,卸载策略为FORCE_IMCI

  1. PQ Worker 被调度到远程列存索引只读节点执行 SELECT 扫描。

  2. 扫描结果通过内部网络传回主(RW)节点(支持压缩)。

  3. 多个 PQ Worker 在主(RW)节点本地并行扫描源表数据。

  4. 扫描结果并行写入容器表各分区。

  5. 主(RW)节点本地完成数据写入。

特性

  • 端到端并行:扫描和写入在同一个并行执行计划中完成。

  • 窄表场景下近线性扩展。

  • 不受 ETL 单端口网络传输限制。

  • 多主集群(Limitless)下暂不支持,自动回退到串行。

网络压缩(MPP 卸载场景)

启用条件(需同时满足):

参数

示例值

可否 SESSION 设置

说明

materialized_view_etl_compression_algorithm

ZSTD

需设置为ZSTD。指定在物化视图刷新过程中,从副本节点进行ETL(数据抽取、转换、加载)时的数据压缩算法。

  • UNCOMPRESSED(默认)

  • ZSTD

materialized_view_etl_compression_level

3

设置 ZSTD 压缩级别。为ETL过程中的数据压缩算法设置压缩级别。如果该值设置为0或无效值,系统将使用默认值(ZSTD3)。

  • 取值范围:0-22

  • 默认值:0

效果

  • 可降低 60%~80% 的节点间传输数据量。

  • 压缩/解压会增加 CPU 开销,在 CPU 瓶颈场景下需权衡。

操作建议

压缩传输仅推荐宽表场景使用。窄表场景下压缩的 CPU 开销可能抵消网络收益,建议保持 UNCOMPRESSED。若物化视图为宽表且需要卸载执行,也可直接使用 ETL 模式替代 ePQ + MPP 卸载,ETL 模式天然适合宽表。

使用步骤

场景 A:MPP 卸载到远程节点

参数

示例值

可否 SESSION 设置

说明

materialized_view_refresh_parallelism

16

设置并行度(大于1时,启用并行刷新)。

materialized_view_implicit_partition_num

16

设置隐式分区数。

说明

MySQL 8.0.1版本暂不支持materialized_view_implicit_partition_num参数。

materialized_view_complete_refresh_offload_policy

FORCE_IMCI

手动刷新时可按会话指定不同卸载策略。

pq_mpp_allow_imci_node

ON

允许卸载调度到列存索引只读节点。

materialized_view_etl_compression_algorithm

ZSTD

启用压缩传输(宽表推荐,窄表可跳过)。

materialized_view_etl_compression_level

3

设置压缩传输的压缩级别。

上述参数配置完成后,执行刷新:

-- 执行刷新
REFRESH MATERIALIZED VIEW <schema_name>.<mview_name>;

场景 B:指定 ePQ 卸载到特定列存索引只读节点

如果集群中有多个列存索引只读节点,可使用 pq_mpp_allow_dispatch_to_imci_node 控制哪些列存索引只读节点允许接收 ePQ MPP 调度请求。该参数需要在主(RW)节点和目标列存索引只读节点上同时设置为 ON;未开启的列存索引只读节点不会作为调度目标。

-- 1. 在主(RW)节点关闭 IMCI 作为 PQ Worker 资源的能力
-- 控制台配置 pq_mpp_allow_imci_node = OFF;

-- 2. 在主(RW)节点允许调度到 IMCI 节点
-- 控制台配置 pq_mpp_allow_dispatch_to_imci_node = ON;

-- 3. 连接到希望承接卸载查询的 IMCI 节点,仅在该节点开启调度入口
-- 控制台配置 pq_mpp_allow_dispatch_to_imci_node = ON;

-- 4. 回到主(RW)节点,使用 IMCI 卸载策略刷新
SET SESSION materialized_view_complete_refresh_offload_policy = FORCE_IMCI;
REFRESH MATERIALIZED VIEW <schema_name>.<mview_name>;

开启后,可通过 information_schema.cluster_group_resource_view 观察目标节点状态。目标列存索引只读节点应显示为 allow_to_dispatchEXTRA 中包含 Allow to dispatch to IMCI node。该模式下列存索引只读节点只接收调度请求,不作为 PQ Worker 资源参与并行执行,如果希望所有列存索引只读节点都作为 ePQ Worker 资源参与执行,应使用 pq_mpp_allow_imci_node = ON

卸载目标节点选择

当卸载策略非MASTER时,系统需要选择一个远程节点来执行 SELECT 查询。

策略决定节点类型

materialized_view_complete_refresh_offload_policy

候选节点类型

无可用节点时的行为

PREFER_IMCI

列存索引只读节点

回退到主( RW)节点本地执行,输出警告日志。

FORCE_IMCI

列存索引只读节点

报错失败。

PREFER_TPRO

行存只读节点

回退到主( RW)节点本地执行,输出警告日志。

FORCE_TPRO

行存只读节点

报错失败。

COST

列存索引只读节点或行存只读节点(代价决定)

仅一种可用时选该类型,都不可用则回退主( RW)节点。

COST策略的代价决策

materialized_view_complete_refresh_offload_policy = COST 时,系统根据查询的优化器代价与阈值比较来决定目标节点:

  • 查询代价 ≥ cost_threshold_for_imci:卸载到列存索引只读节点(列存索引适合大代价的扫描与聚合查询)。

  • 查询代价 < cost_threshold_for_imci:卸载到行存只读节点(轻量查询用行存只读节点即可)。

-- 设置代价阈值(默认 0,即所有查询都倾向 IMCI)
SET SESSION cost_threshold_for_imci = 100000;

-- 使用代价策略
SET SESSION materialized_view_complete_refresh_offload_policy = COST;

多节点负载均衡

当同一类型有多个节点时,系统通过 Round-Robin 方式轮询选择节点:

  • 每次刷新任务按全局计数器顺序选取下一个节点。

  • 若选中的节点连接失败,自动尝试列表中的下一个节点,直到所有节点都尝试过。

  • 不同的物化视图刷新任务会被均匀分布到各节点上。

对于ePQ + MPP卸载到列存索引(IMCI)的场景,可以有两种方式:

  1. 开启pq_mpp_allow_imci_node,支持卸载到全部的列存索引只读节点。

  2. 先关闭pq_mpp_allow_imci_node = OFF,然后通过 pq_mpp_allow_dispatch_to_imci_node 缩小候选列存索引只读节点范围:

    • 在主(RW)节点设置 pq_mpp_allow_dispatch_to_imci_node = ON,允许主(RW)节点接受远端列存索引只读节点的调度入口状态。

    • 在希望承接卸载查询的列存索引只读节点上设置 pq_mpp_allow_dispatch_to_imci_node = ON

    • 在不希望承接卸载查询的列存索引只读节点上保持 pq_mpp_allow_dispatch_to_imci_node = OFF

推荐策略

生产环境建议使用 FORCE_IMCIFORCE_TPRO,避免使用 PREFER_* 策略。

原因: PREFER_*策略在目标节点不可用时会静默回退到主( RW)节点本地执行,此时INSERT SELECT将在主( RW)节点上完成全量扫描和写入,形成大事务,可能影响主( RW)节点的在线业务性能。

配置示例

-- 推荐:强制使用 IMCI 节点,不可用时报错而非回退
SET SESSION materialized_view_complete_refresh_offload_policy = FORCE_IMCI;

-- 仅使用只读节点,不可用时报错
SET SESSION materialized_view_complete_refresh_offload_policy = FORCE_TPRO;

-- 根据查询代价自动选择 IMCI 或 TPRO
SET SESSION materialized_view_complete_refresh_offload_policy = COST;
SET SESSION cost_threshold_for_imci = 50000;

参数作用域与设置方式

基本规则

  • GLOBAL 参数:仅能在控制台设置,对所有会话和自动刷新线程统一生效。

  • SESSION 参数:可通过SET SESSION针对当前会话设置,也可通过控制台修改默认值,自动刷新线程使用的GLOBAL默认值。

ETL 并行写入模式的参数作用域

参数

作用域

可否 SESSION 设置

说明

materialized_view_refresh_parallelism

GLOBAL

否,必须 GLOBAL

所有刷新任务共用同一并行度。

materialized_view_complete_refresh_offload_policy

SESSION

手动刷新时可按会话指定不同卸载策略。

materialized_view_use_atomic_autoinc_for_refresh

SESSION

可按需关闭原子自增优化。

materialized_view_cache_etl_result

SESSION

可按需开启结果集缓存。

ePQ 并行写入模式的参数作用域

参数

作用域

可否 SESSION 设置

说明

materialized_view_refresh_parallelism

GLOBAL

否,必须 GLOBAL

所有刷新任务共用同一并行度。

pq_mpp_allow_imci_node

GLOBAL

否,必须 GLOBAL

MPP 调度到 IMCI 节点的全局开关。

pq_mpp_allow_dispatch_to_imci_node

GLOBAL

否,必须 GLOBAL

允许使用 IMCI 调度入口,主(RW)节点和目标列存索引只读节点均需开启。

materialized_view_complete_refresh_offload_policy

SESSION

手动刷新时可按会话指定卸载策略。

materialized_view_implicit_partition_num

SESSION

不同物化视图可使用不同分区数。

materialized_view_etl_compression_algorithm

SESSION

MPP 卸载时的传输压缩,自动传播到 PQ Worker。

materialized_view_etl_compression_level

SESSION

压缩级别,自动传播到 PQ Worker。

说明事项

  • 若仅使用手动刷新,SESSION参数可按会话灵活调整。

  • 若依赖自动刷新,所有SESSION参数都需要通过控制台设置合理的默认值。

  • GLOBA参数无论哪种刷新方式都必须在控制台设置,且修改后对所有后续任务立即生效。

  • SET SESSION在集群重启后失效,而GLOBA参数在控制台修改会保持持久化。

参数参考

核心参数

参数

作用域

范围

默认值

说明

materialized_view_refresh_parallelism

GLOBAL

1~1024

1

并行 Worker 数,大于1时,启用并行刷新。

materialized_view_implicit_partition_num

SESSION

0~无上限

1

容器表隐式 HASH 分区数,大于1时启用。

说明

MySQL 8.0.1版本暂不支持materialized_view_implicit_partition_num参数。

materialized_view_use_atomic_autoinc_for_refresh

SESSION

ON/OFF

ON

隐式分区列使用原子自增值(性能更优)。

计算卸载参数

参数

作用域

范围

默认值

说明

materialized_view_complete_refresh_offload_policy

SESSION

卸载策略(materialized_view_complete_refresh_offload_policy参数)详解

PREFER_IMCI

查询卸载策略。

pq_mpp_allow_imci_node

GLOBAL

ON/OFF

OFF

允许将 PQ Worker 调度到列存索引只读节点(ePQ 模式需要)。

pq_mpp_allow_dispatch_to_imci_node

GLOBAL

ON/OFF

OFF

允许使用IMCI调度入口,主(RW)节点和目标列存索引只读节点均需开启。

网络压缩参数

参数

作用域

范围

默认值

说明

materialized_view_etl_compression_algorithm

SESSION

  • UNCOMPRESSED

  • ZSTD

UNCOMPRESSED

PQ 内部通道压缩算法,仅ePQ MPP卸载模式使用。

materialized_view_etl_compression_level

SESSION

0~22

0

PQ 通道 ZSTD 压缩级别(0=使用 ZSTD 默认级别 3)。

materialized_view_cache_etl_result

SESSION

ON/OFF

OFF

缓存全部结果集到内存(仅 ETL 模式)。

压缩生效方式:

模式

压缩位置

生效条件

ePQ(MPP 卸载)

主(RW)节点 ↔ 远程节点的 PQ 内部通道

materialized_view_etl_compression_algorithm = ZSTD

ePQ(纯本地)

无网络传输

不适用

materialized_view_etl_compression_level 仅在 materialized_view_etl_compression_algorithm = ZSTD 时生效。设置为 0 时使用 ZSTD 默认级别 3,设置为 1~22 时使用指定级别,级别越高通常压缩率越高,但 CPU 开销也更大。

卸载策略(materialized_view_complete_refresh_offload_policy参数)详解

行为

MASTER

不卸载,全部在主(RW)节点本地执行。

PREFER_TPRO

优先卸载到行存只读节点,不可用时回退到主(RW)节点。

PREFER_IMCI

优先卸载到列存索引只读节点,不可用时回退到主(RW)节点。

FORCE_TPRO

强制卸载到行存只读节点,不可用时报错。

FORCE_IMCI

强制卸载到列存索引只读节点,不可用时报错。

COST

基于代价模型自动选择列存索引只读节点或行存只读节点。

模式选择建议

场景

推荐模式

关键配置

窄表,无远程节点

ePQ 纯本地

materialized_view_complete_refresh_offload_policy=MASTER

窄表,有列存索引只读节点/行存只读节点

ETL/ePQ + MPP 卸载

materialized_view_complete_refresh_offload_policy=FORCE_IMCI

宽表或含大字段

ETL

materialized_view_complete_refresh_offload_policy=FORCE_IMCI

多主集群(Limitless

ETL

使用 ETL 模式(ePQ 在多主集群环境下暂不可用)

注意事项

  • 并行度为 1 时不生效:两种并行模式均退化为串行 INSERT SELECT。

  • 远程节点可用性:ETL 模式及 ePQ MPP 卸载均依赖远程节点。FORCE_*策略在节点不可用时报错,PREFER_* 策略则回退到主(RW)节点本地执行。

  • 多主环境限制:ePQ 模式在多主集群(Limitless)下自动禁用并回退到串行。如需并行刷新请使用 ETL 模式。

  • IMCI 列覆盖:ePQ + MPP 卸载到列存索引只读节点时,要求列存索引覆盖物化视图查询中所有需要读取的列,否则报错。ETL 模式无此限制。

  • 隐式分区数:建议设为并行度的 1/2 ~ 2 倍。过少导致写入竞争;过多增加文件管理开销。

  • 写入位置:两种模式的数据写入始终在主(RW)节点本地完成。「卸载」仅影响 SELECT 查询的执行位置。

  • 参数持久化SET SESSION在集群重启后失效,而GLOBA参数在控制台修改会保持持久化。

  • 压缩与 CPU 权衡:ePQ MPP 卸载推荐使用 materialized_view_etl_compression_algorithm=ZSTD。窄表场景下压缩的 CPU 开销可能抵消网络收益。