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 開銷可能抵消網路收益。