マテリアライズドビューは、複雑なクエリの結果を事前に計算して保存することで、クエリを最適化するデータベースオブジェクトです。これらの結果を保存することで、事前に計算されたデータに直接クエリを実行できます。これにより、リソースを大量に消費する操作の再実行を回避し、ストレージ領域と引き換えにクエリ時間を短縮してクエリを高速化します。
PolarDB for MySQL クラスターのマテリアライズドビューは、完全更新をサポートしています。定期更新と手動更新の両方のメソッドがサポートされています。マテリアライズドビューは、更新にバックグラウンドタスクメカニズムを使用します。インメモリー列指向インデックス (IMCI) と併用してクエリを高速化し、更新タスクの効率を向上させ、読み取り専用ノードの負荷を軽減できます。PolarDB の HTAP アーキテクチャ上に構築されたこの機能は、分析処理 (AP) 能力をさらに強化します。
マテリアライズドビューは、直接クエリできるデータの物理的なコピーを含む点で、通常のビューとは異なります。マテリアライズドビューは、ビューとその基になる物理ベーステーブルで構成されます。
-
マテリアライズドビューの作成:ビューの作成とデータのマテリアライズは、2つの別々のステップです。マテリアライズプロセスは、物理ベーステーブルにデータを投入するためにバックグラウンドタスクにプッシュされる非同期操作です。物理ベーステーブルの名前はビューに関連付けられます。マテリアライズと更新タスクには、クエリと挿入操作が含まれます。クエリ操作は、IMCI を備えた読み取り専用ノードにオフロードしてクエリを高速化し、プライマリノードへの影響を軽減できます。
-
マテリアライズドビューのクエリ:マテリアライズドビューに対するクエリは、その基になる物理ベーステーブルに対して実行されます。
-
マテリアライズドビューの更新:完全更新プロセスでは、新しい非表示の物理ベーステーブルが作成されます。非表示テーブルで更新文が実行された後、システムは元のベーステーブルと非表示のベーステーブルを切り替えます。このアクションにより、メタデータテーブルが最新の物理ベーステーブルの情報で更新され、クエリ用のメモリ内構造と同期されます。
-
タスクのモニタリングと管理:バックグラウンドの更新タスクキューをクエリして、タスク詳細を表示できます。また、テーブル、データベース、またはグローバルレベルでマテリアライズドビューの定期更新タスクを一時停止または再開することで、タスクをモニタリングおよび管理することもできます。
前提条件
ご利用の PolarDB for MySQL クラスターは、次のいずれかの要件を満たす必要があります:
-
MySQL 8.0.1 で、マイナーエンジンバージョンが 8.0.1.1.51 以降であること。
-
MySQL 8.0.2 で、マイナーエンジンバージョンが 8.0.2.2.31 以降であること。
メリット
-
繰り返し計算の回避:複雑でリソース集約型のクエリの場合、結果は一度計算され、複数回再利用されるため、クエリ効率が大幅に向上します。
-
データの事前集計:日次、週次、月次のレポート用にデータを事前集計して、レポート生成とデータ分析を高速化できます。
-
大規模データセットに対するクエリの最適化:大量の生データの直接スキャンを削減し、分析クエリの応答時間を短縮します。
-
多次元分析のサポート:さまざまなディメンションの組み合わせに対して集計データを事前計算し、OLAP やその他の多次元分析シナリオを効率的にサポートできます。
利用シーン
マテリアライズドビューは、クエリ結果を事前に計算して保存することで、クエリパフォーマンスを最適化します。特に大規模なデータや複雑なクエリの処理に役立ちます。リアルタイム計算のオーバーヘッドを削減し、複雑なクエリロジックを簡素化するため、迅速なレポート生成やデータ分析に最適です。
-
繰り返し計算の回避:頻繁にクエリされ、リソースを大量に消費する計算結果の保存に適しています。マテリアライズドビューを使用すると、同じデータの再計算を回避でき、クエリ効率が大幅に向上します。
-
データの事前集計:レポート生成やデータ分析において、マテリアライズドビューは日次、週次、月次の売上データやユーザー行動データなどを事前集計できます。計算結果を事前に保存することで、リアルタイム計算に必要な時間とリソースを削減できます。
-
大規模データセットに対するクエリの最適化:大量の生データを直接クエリすると、頻繁な大規模スキャンのために時間がかかることがあります。マテリアライズドビューは、生データへの直接アクセスの必要性を減らし、クエリと分析を高速化します。
-
多次元分析のサポート:マテリアライズドビューは、さまざまなディメンションの組み合わせに対して集計データを事前計算し、シナリオベースの多次元データ分析に対して高速で効率的なクエリ応答を可能にします。
パラメーター
PolarDB クラスターパラメーターの変更方法は、コンソールとデータベースセッションで異なります。違いは次のとおりです:
互換性:MySQL 設定ファイルとの互換性のため、PolarDB コンソールの一部のクラスターパラメーターには loose_ プレフィックスが付いています。
手順:
loose_プレフィックスが付いているパラメーターを見つけて変更します。
データベースセッション (コマンドラインまたはクライアントを使用) の場合
手順:
SETコマンドを使用してデータベースセッションでパラメーターを変更する場合、loose_プレフィックスを削除し、元のパラメーター名を使用します。
|
パラメーター |
説明 |
|
loose_materialized_view_enabled |
マテリアライズドビューを有効にするかどうかを指定します。有効な値:
|
|
loose_enable_materialized_view_parallel |
マテリアライズドビューのパラレルクエリ機能を有効にするかどうかを指定します。有効な値:
|
マテリアライズドビューの作成
構文
CREATE
MATERIALIZED VIEW view_name [(column_list)]
[REFRESH [COMPLETE|FAST]]
[ON [COMMIT|DEMAND]]
[START WITH now()] [NEXT now() + interval 1 hour]
[[DISABLE|ENABLE] QUERY REWRITE]
[MATERIALIZED OPTIONS = 'json_options']
AS select_statement
権限
-
マテリアライズドビューが配置されているデータベースに対する
CREATE権限。 -
マテリアライズドビューのすべてのベーステーブルの関連する列 (またはテーブル全体) に対する
SELECT権限。
パラメーター
|
パラメーター |
必須 |
説明 |
|
view_name |
はい |
マテリアライズドビューの名前。 |
|
column_list |
いいえ |
マテリアライズドビューに含める列。ビューの列に特定の名前を割り当てるには、 |
|
REFRESH |
いいえ |
マテリアライズドビューの更新ポリシーを指定します。
説明
このトピックでは、完全更新ポリシーについて説明します。増分更新ポリシーの詳細については、「マテリアライズドビューの増分更新」をご参照ください。 |
|
ON |
いいえ |
マテリアライズドビューのマテリアライズタイプを指定します。
説明
現在、非同期マテリアライズドビュータイプのみがサポートされています。 |
|
START WITH |
いいえ |
非同期マテリアライズドビューの自動更新の開始時刻。 |
|
NEXT |
いいえ |
非同期マテリアライズドビューの更新間隔。 説明
NEXT を指定しない場合、ビューは手動でのみ更新できます。 |
|
QUERY REWRITE |
いいえ |
マテリアライズドビューがクエリリライトをサポートするかどうかを指定します。
説明
現在、クエリリライトはサポートされていません。 |
|
MATERIALIZED OPTIONS |
いいえ |
マテリアライズドビューの拡張パラメーターを指定します。値は文字列で、通常は JSON オブジェクトです。詳細については、「mv_options の使用方法」をご参照ください。 |
|
select_statement |
はい |
マテリアライズドビューのデータを定義するクエリ文。この文はベーステーブルからデータを取得し、結果をマテリアライズドビューに保存します。 |
mv_options の使用方法
mv_options は MATERIALIZED OPTIONS = 'json_options' 句で指定されます。この句は AS select_statement の前に記述する必要があり、json_options は有効な JSON オブジェクトである必要があります。
-
サポートされているバージョン:
-
MySQL 8.0.1、カーネルマイナーバージョン
8.0.1.1.55以降。 -
MySQL 8.0.2、カーネルマイナーバージョン
8.0.2.2.35以降。
-
-
mv_optionsは次のフィールドをサポートしています:フィールド
タイプ
値
説明
order_keySTRING
列名または式テキスト。
マテリアライズドビューのコンテナテーブルの
order_keyを設定します。engineSTRING
-
InnoDB -
XEngine
マテリアライズドビューのコンテナテーブルが使用するストレージエンジンを指定します。値の大文字と小文字は区別されません。
table_formatSTRING
-
row -
column
コンテナテーブルの行ストアまたは列ストア形式を指定します。値の大文字と小文字は区別されません。
-
InnoDBエンジンはrowのみをサポートします。 -
XEngineエンジンはrowとcolumnの両方をサポートし、通常はengine: "xengine"と一緒に使用されます。
refresh_policySTRING
-
MASTER -
PREFER_TPRO -
PREFER_IMCI -
FORCE_TPRO -
FORCE_IMCI -
COST
完全更新タスクのプッシュダウンポリシーを指定します。値の大文字と小文字は区別されません。空の文字列または不明な値は、システム変数で指定されたデフォルトポリシーにフォールバックします。
-
MASTER:プライマリノードで更新します。 -
PREFER_TPRO:行ストアの読み取り専用 (RO) ノードでの更新を優先します。行ストアの RO ノードが存在しない場合は、プライマリノードで更新します。 -
PREFER_IMCI:列ストアインデックスの RO ノードでの更新を優先します。列ストアインデックスの RO ノードが存在しない場合は、プライマリノードで更新します。 -
FORCE_TPRO:行ストアの RO ノードで強制的に更新します。行ストアの RO ノードが存在しない場合は、エラーを報告します。 -
FORCE_IMCI:列ストアインデックスの RO ノードで強制的に更新します。列ストアインデックスの RO ノードが存在しない場合は、エラーを報告します。 -
COST:クエリコストに基づいて、行ストアの RO ノードと列ストアインデックスの RO ノードのいずれかを選択して更新を実行します。
unique_checkINT
-
1 -
0
XEngine 列ストアコンテナテーブルに使用されます。
-
0は更新中の一意性チェックを緩和します。 -
1またはフィールドを省略すると、デフォルトのチェックが維持されます。
説明engine、table_format、refresh_policy、およびunique_checkは、現在 MySQL 8.0.2 でのみサポートされています。 -
-
注意事項:
-
MATERIALIZED OPTIONS = ''は、拡張パラメーターが設定されていないものとして扱われます。 -
SHOW CREATE TABLEがマテリアライズドビュー定義を出力する際、設定されたMATERIALIZED OPTIONS句が含まれます。 -
構文レイヤーは文字列のみを受け入れます。後続の解析が失敗した場合、
WARNINGが記録され、対応するパラメーターが解析されなかったかのようにデフォルトの動作で処理が続行されます。
-
-
例:
CREATE MATERIALIZED VIEW mv1 REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 hour MATERIALIZED OPTIONS = '{"engine":"xengine","table_format":"column","order_key":"col1"}' AS SELECT col1, col2 FROM tbl1;
例
-
マテリアライズドビューのベーステーブルとして使用する
table1とtable2テーブルを作成します。-- ベーステーブルを作成します。 CREATE TABLE table1 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT); CREATE TABLE table2 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT); -- ベーステーブルにデータを挿入します。 INSERT INTO table1 VALUES (1, 'A', 100), (2, 'B', 200), (3, 'C', 300), (4, 'D', 400); INSERT INTO table2 VALUES (1, 'X', 10), (2, 'Y', 20), (3, 'Z', 30), (5, 'W', 50); -
マテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW mv1 REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 hour AS SELECT SUM(t1.col3) AS sum_value, AVG(t1.col3) AS avg_value FROM table1 t1 JOIN table2 t2 ON t1.col1 = t2.col1; -
mv_optionsを使用してマテリアライズドビューを作成します。CREATE MATERIALIZED VIEW mv2 REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 hour MATERIALIZED OPTIONS = '{"engine":"xengine","table_format":"column","refresh_policy":"FORCE_IMCI"}' AS SELECT t1.col1, t1.col2, t1.col3 FROM table1 t1 JOIN table2 t2 ON t1.col1 = t2.col1;
マテリアライズドビューのクエリ
マテリアライズドビューのクエリには、ビューに対する SELECT 権限が必要です。ビューの基になるベーステーブルに対する SELECT 権限は必要ありません。
マテリアライズドビューのクエリ
SELECT * FROM mv1;
期待される出力は次のとおりです:
+-----------+-----------+
| sum_value | avg_value |
+-----------+-----------+
| 600 | 200.0000 |
+-----------+-----------+
ビュー定義のクエリ
SHOW CREATE VIEW mv1;
期待される出力は次のとおりです:
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| mv1 | CREATE MATERIALIZED VIEW `mv1` REFRESH COMPLETE ON DEMAND START WITH ('2025-10-15 11:20:15') NEXT (now() + interval 1 hour) AS select sum(`t1`.`col3`) AS `sum_value`,avg(`t1`.`col3`) AS `avg_value` from (`table1` `t1` join `table2` `t2` on((`t1`.`col1` = `t2`.`col1`))) | utf8mb4 | utf8mb4_0900_ai_ci |
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
システムテーブルからのクエリ
SELECT * FROM mysql.view_materialized_info;
フィールドの説明
|
フィールド |
説明 |
|
TABLE_SCHEMA |
マテリアライズドビューが配置されているデータベースの名前。 |
|
TABLE_NAME |
マテリアライズドビューの名前。 |
|
IS_DROPPED |
ビューが削除されたかどうかを示します。
|
|
FIRST_REFRESH_TIME |
自動更新が設定されている場合、これは最初の更新の時刻です。 |
|
TIME_ZONE |
タイムゾーン設定。 |
|
REFRESH_CONDITION |
更新のトリガーメカニズム。
|
|
REFRESH_STRATEGY |
マテリアライズドビューの更新ポリシー。
|
|
REFRESH_START_TIME |
最初の更新に設定された開始時刻。 |
|
NEXT_TIME_EXPRESSION |
非同期マテリアライズドビューの次の更新時刻の定義。 |
|
LAST_START_TIME |
最後の更新が実際に開始された時刻。 |
|
LAST_END_TIME |
最後の更新が実際に終了した時刻。 |
|
CONTAINER_TABLE_POSTFIX |
データストレージに使用される物理テーブルのサフィックス。 |
|
EXPIRED_TABLE_POSTFIX |
更新後に期限切れのデータを保持する物理テーブルのサフィックス。 |
|
IS_STOPPED |
定期更新が停止しているかどうかを示します。
|
|
CREATE_TIME |
マテリアライズドビューのメタデータが作成された時刻。 |
|
UPDATE_TIME |
マテリアライズドビューのメタデータが最後に更新された時刻。 |
期待される出力は次のとおりです:
+-----+--------------+------------+------------+---------------------+-----------+-------------------+------------------+---------------------+---------------------------+---------------------+---------------------+-------------------------+-----------------------+------------+---------------------+---------------------+
| id | table_schema | table_name | is_dropped | first_refresh_time | time_zone | refresh_condition | refresh_strategy | refresh_start_time | next_time_expression | last_start_time | last_end_time | container_table_postfix | expired_table_postfix | is_stopped | create_time | update_time |
+-----+--------------+------------+------------+---------------------+-----------+-------------------+------------------+---------------------+---------------------------+---------------------+---------------------+-------------------------+-----------------------+------------+---------------------+---------------------+
| 471 | testmv | mv1 | 0 | 2025-10-15 11:20:16 | +08:00 | DEMAND | COMPLETE | 2025-10-15 11:20:15 | (now() + interval 1 hour) | 2025-10-15 11:20:15 | 2025-10-15 11:20:16 | 2022929596417 | 2022929596417 | 0 | 2025-10-15 11:20:16 | 2025-10-15 11:20:16 |
+-----+--------------+------------+------------+---------------------+-----------+-------------------+------------------+---------------------+---------------------------+---------------------+---------------------+-------------------------+-----------------------+------------+---------------------+---------------------+
マテリアライズドビューの更新
現在、マテリアライズドビューは完全更新のみをサポートしています。このプロセスでは out-of-place 方式を使用します。非表示の物理ベーステーブルを作成し、その上で更新文を実行してから、元のベーステーブルと非表示のベーステーブルを切り替えます。したがって、完全更新には追加のストレージ領域が必要です。その主な利点は、任意の SQL クエリをサポートすることです。
マテリアライズドビューは、手動更新と定期更新の 2 つの更新メソッドをサポートしています。
手動更新
マテリアライズドビューが定期更新用に設定されていない場合、または更新間隔が長い場合は、REFRESH MATERIALIZED VIEW コマンドを使用して手動でデータを更新できます。
REFRESH MATERIALIZED VIEW <view_name>;
例
-
新しいテストデータを挿入します。
INSERT INTO table1 VALUES (5, 'E', 500), (6, 'F', 600); INSERT INTO table2 VALUES (7, 'U', 60), (8, 'V', 70); -
マテリアライズドビューを手動で更新します。
REFRESH MATERIALIZED VIEW mv1; -
マテリアライズドビューをクエリします。
SELECT * FROM mv1;期待される出力は次のとおりです:
+-----------+-----------+ | sum_value | avg_value | +-----------+-----------+ | 1100 | 275.0000 | +-----------+-----------+
定期更新
マテリアライズドビューを作成する際に、START WITH を使用して定期更新の開始時刻を指定し、NEXT を使用して自動更新間隔を設定できます。システムは、指定された設定に基づいて更新タスクを自動的にスケジュールします。
CREATE MATERIALIZED VIEW mv1
REFRESH COMPLETE
ON DEMAND
START WITH now() NEXT now() + INTERVAL 1 hour
AS
SELECT
SUM(t1.col3) AS sum_value,
AVG(t1.col3) AS avg_value
FROM table1 t1
JOIN table2 t2 ON t1.col1 = t2.col1;
マテリアライズドビューの削除
マテリアライズドビューを削除するには、マテリアライズドビューが配置されているデータベースに対する DROP 権限が必要です。
構文
DROP MATERIALIZED VIEW <view_name>;
例
DROP MATERIALIZED VIEW mv1;
タスクのモニタリングと管理
マテリアライズドビューの定期更新は、システムの自動スケジューリングメカニズムに依存しています。多数の定期タスクをモニタリングおよび管理する必要がある場合があります。テーブル、データベース、またはグローバルレベルでマテリアライズドビューの定期更新タスクを一時停止または再開できます。
タスクキューの表示
information_schema.materialized_view_refresh_queue システムビューをクエリして、更新キューを表示できます。
SELECT * FROM information_schema.materialized_view_refresh_queue;
タスクキューの一時停止
テーブル単位
STOP MATERIALIZED VIEW task FOR TABLE mv1;
データベース単位
STOP MATERIALIZED VIEW task FOR DATABASE mv1;
グローバル
STOP MATERIALIZED VIEW task FOR ALL;
タスクキューの再開
テーブル単位
RESTART MATERIALIZED VIEW task FOR TABLE mv1;
データベース単位
RESTART MATERIALIZED VIEW task FOR DATABASE mv1;
グローバル
RESTART MATERIALIZED VIEW task FOR ALL;