PolarDB MySQL版物化视图的全量刷新(Complete Refresh)和增量刷新的首次刷新,支持 ETL 并行写入和 ePQ 并行写入两种模式,您可以根据宽窄表、集群系列(集群版/多主集群)、是否需要计算卸载等场景特征选择合适的并行写入模式,以提升刷新执行效率。
概述
PolarDB MySQL版物化视图的全量刷新(Complete Refresh)和增量刷新的首次刷新,支持以下两种并行写入模式来提高执行效率:
模式 | 开关 | 架构 | 适用场景 |
ETL 并行写入(默认) | 默认模式(并行度 > 1 时自动启用) | 查询卸载到远程节点执行,多 Worker 并行消费结果写入。 | 宽表、大数据量、需要计算卸载。 |
ePQ 并行写入 | 需手动切换 | PQ 框架将 | 窄表、需要端到端并行。 |
两种模式均要求 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.34与8.0.2.2.35 | ePQ 模式 |
|
刷新流程
物化视图完全刷新分为三个阶段:
创建容器表:根据物化视图定义创建新容器表。若
materialized_view_implicit_partition_num > 1,自动添加 HASH 分区,消除并行写入时的锁竞争。说明MySQL 8.0.1版本暂不支持
materialized_view_implicit_partition_num参数。并行数据写入:根据所选模式执行并行写入。
构建列存索引(可选):若
materialized_view_add_columnar_index_after_insert = ON,先完成刷新,然后再为容器表构建列存索引(IMCI)。
ETL 并行写入模式
工作原理
根据卸载策略选择远程节点(列存索引只读节点或行存只读节点),建立连接。
将物化视图的定义查询发送到远程节点执行。
远程节点流式返回结果集(支持压缩传输)。
主(RW)节点创建多个 Worker 线程,各 Worker 并行获取行并写入容器表各分区。
特性
查询计算在远程节点完成,不占用主(RW)节点CPU。
写入在主(RW)节点本地执行,保证事务一致性。
宽表场景下并行效率不受行长影响。
使用步骤
PolarDB集群参数在控制台与会话中修改方式存在差异,详细区别如下:
在PolarDB控制台上修改:
兼容性说明:部分集群参数在PolarDB控制台上均已添加MySQL配置文件的兼容性前缀loose_。
操作方法:找到并修改这些带
loose_前缀的参数。
在数据库会话中修改(使用命令行或客户端):
操作方法:当您连接到数据库,使用
SET命令修改参数时,请去掉loose_前缀,直接使用参数的原始名称进行修改。
参数 | 示例值 | 可否 SESSION 设置 | 说明 |
| 16 | 否 | 设置并行度(大于1时,启用并行刷新)。 |
| FORCE_IMCI | 是 | 手动刷新时可按会话指定不同卸载策略。 |
上述参数配置完成后,执行刷新:
-- 执行刷新
REFRESH MATERIALIZED VIEW <schema_name>.<mview_name>;ePQ 并行写入模式
工作原理(MPP 卸载到远程列存索引只读节点,卸载策略为FORCE_IMCI)
PQ Worker 被调度到远程列存索引只读节点执行 SELECT 扫描。
扫描结果通过内部网络传回主(RW)节点(支持压缩)。
多个 PQ Worker 在主(RW)节点本地并行扫描源表数据。
扫描结果并行写入容器表各分区。
主(RW)节点本地完成数据写入。
特性
端到端并行:扫描和写入在同一个并行执行计划中完成。
窄表场景下近线性扩展。
不受 ETL 单端口网络传输限制。
多主集群(Limitless)下暂不支持,自动回退到串行。
网络压缩(MPP 卸载场景)
启用条件(需同时满足):
参数 | 示例值 | 可否 SESSION 设置 | 说明 |
| ZSTD | 是 | 需设置为ZSTD。指定在物化视图刷新过程中,从副本节点进行ETL(数据抽取、转换、加载)时的数据压缩算法。
|
| 3 | 是 | 设置 ZSTD 压缩级别。为ETL过程中的数据压缩算法设置压缩级别。如果该值设置为0或无效值,系统将使用默认值(ZSTD为3)。
|
效果
可降低 60%~80% 的节点间传输数据量。
压缩/解压会增加 CPU 开销,在 CPU 瓶颈场景下需权衡。
操作建议
压缩传输仅推荐宽表场景使用。窄表场景下压缩的 CPU 开销可能抵消网络收益,建议保持 UNCOMPRESSED。若物化视图为宽表且需要卸载执行,也可直接使用 ETL 模式替代 ePQ + MPP 卸载,ETL 模式天然适合宽表。
使用步骤
场景 A:MPP 卸载到远程节点
参数 | 示例值 | 可否 SESSION 设置 | 说明 |
| 16 | 否 | 设置并行度(大于1时,启用并行刷新)。 |
| 16 | 是 | 设置隐式分区数。 说明 MySQL 8.0.1版本暂不支持 |
| FORCE_IMCI | 是 | 手动刷新时可按会话指定不同卸载策略。 |
| ON | 否 | 允许卸载调度到列存索引只读节点。 |
| ZSTD | 是 | 启用压缩传输(宽表推荐,窄表可跳过)。 |
| 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_dispatch,EXTRA 中包含 Allow to dispatch to IMCI node。该模式下列存索引只读节点只接收调度请求,不作为 PQ Worker 资源参与并行执行,如果希望所有列存索引只读节点都作为 ePQ Worker 资源参与执行,应使用 pq_mpp_allow_imci_node = ON。
卸载目标节点选择
当卸载策略非MASTER时,系统需要选择一个远程节点来执行 SELECT 查询。
策略决定节点类型
| 候选节点类型 | 无可用节点时的行为 |
| 列存索引只读节点 | 回退到主( RW)节点本地执行,输出警告日志。 |
| 列存索引只读节点 | 报错失败。 |
| 行存只读节点 | 回退到主( RW)节点本地执行,输出警告日志。 |
| 行存只读节点 | 报错失败。 |
| 列存索引只读节点或行存只读节点(代价决定) | 仅一种可用时选该类型,都不可用则回退主( 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)的场景,可以有两种方式:
开启
pq_mpp_allow_imci_node,支持卸载到全部的列存索引只读节点。先关闭
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_IMCI 或 FORCE_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 设置 | 说明 |
| GLOBAL | 否,必须 GLOBAL | 所有刷新任务共用同一并行度。 |
| SESSION | 是 | 手动刷新时可按会话指定不同卸载策略。 |
| SESSION | 是 | 可按需关闭原子自增优化。 |
| SESSION | 是 | 可按需开启结果集缓存。 |
ePQ 并行写入模式的参数作用域
参数 | 作用域 | 可否 SESSION 设置 | 说明 |
| GLOBAL | 否,必须 GLOBAL | 所有刷新任务共用同一并行度。 |
| GLOBAL | 否,必须 GLOBAL | MPP 调度到 IMCI 节点的全局开关。 |
| GLOBAL | 否,必须 GLOBAL | 允许使用 IMCI 调度入口,主(RW)节点和目标列存索引只读节点均需开启。 |
| SESSION | 是 | 手动刷新时可按会话指定卸载策略。 |
| SESSION | 是 | 不同物化视图可使用不同分区数。 |
| SESSION | 是 | MPP 卸载时的传输压缩,自动传播到 PQ Worker。 |
| SESSION | 是 | 压缩级别,自动传播到 PQ Worker。 |
说明事项
若仅使用手动刷新,SESSION参数可按会话灵活调整。
若依赖自动刷新,所有SESSION参数都需要通过控制台设置合理的默认值。
GLOBA参数无论哪种刷新方式都必须在控制台设置,且修改后对所有后续任务立即生效。
SET SESSION在集群重启后失效,而GLOBA参数在控制台修改会保持持久化。
参数参考
核心参数
参数 | 作用域 | 范围 | 默认值 | 说明 |
| GLOBAL | 1~1024 | 1 | 并行 Worker 数,大于1时,启用并行刷新。 |
| SESSION | 0~无上限 | 1 | 容器表隐式 HASH 分区数,大于1时启用。 说明 MySQL 8.0.1版本暂不支持 |
| SESSION | ON/OFF | ON | 隐式分区列使用原子自增值(性能更优)。 |
计算卸载参数
参数 | 作用域 | 范围 | 默认值 | 说明 |
| SESSION |
| 查询卸载策略。 | |
| GLOBAL | ON/OFF | OFF | 允许将 PQ Worker 调度到列存索引只读节点(ePQ 模式需要)。 |
| GLOBAL | ON/OFF | OFF | 允许使用IMCI调度入口,主(RW)节点和目标列存索引只读节点均需开启。 |
网络压缩参数
参数 | 作用域 | 范围 | 默认值 | 说明 |
| SESSION |
| UNCOMPRESSED | PQ 内部通道压缩算法,仅ePQ MPP卸载模式使用。 |
| SESSION | 0~22 | 0 | PQ 通道 ZSTD 压缩级别(0=使用 ZSTD 默认级别 3)。 |
| SESSION | ON/OFF | OFF | 缓存全部结果集到内存(仅 ETL 模式)。 |
压缩生效方式:
模式 | 压缩位置 | 生效条件 |
ePQ(MPP 卸载) | 主(RW)节点 ↔ 远程节点的 PQ 内部通道 |
|
ePQ(纯本地) | 无网络传输 | 不适用 |
materialized_view_etl_compression_level 仅在 materialized_view_etl_compression_algorithm = ZSTD 时生效。设置为 0 时使用 ZSTD 默认级别 3,设置为 1~22 时使用指定级别,级别越高通常压缩率越高,但 CPU 开销也更大。
卸载策略(materialized_view_complete_refresh_offload_policy参数)详解
值 | 行为 |
| 不卸载,全部在主(RW)节点本地执行。 |
| 优先卸载到行存只读节点,不可用时回退到主(RW)节点。 |
| 优先卸载到列存索引只读节点,不可用时回退到主(RW)节点。 |
| 强制卸载到行存只读节点,不可用时报错。 |
| 强制卸载到列存索引只读节点,不可用时报错。 |
| 基于代价模型自动选择列存索引只读节点或行存只读节点。 |
模式选择建议
场景 | 推荐模式 | 关键配置 |
窄表,无远程节点 | ePQ 纯本地 |
|
窄表,有列存索引只读节点/行存只读节点 | ETL/ePQ + MPP 卸载 |
|
宽表或含大字段 | ETL |
|
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 开销可能抵消网络收益。