すべてのプロダクト
Search
ドキュメントセンター

PolarDB:マテリアライズドビューの完全更新

最終更新日:Jun 30, 2026

マテリアライズドビューは、複雑なクエリの結果を事前に計算して保存することで、クエリを最適化するデータベースオブジェクトです。これらの結果を保存することで、事前に計算されたデータに直接クエリを実行できます。これにより、リソースを大量に消費する操作の再実行を回避し、ストレージ領域と引き換えにクエリ時間を短縮してクエリを高速化します。

PolarDB for MySQL クラスターのマテリアライズドビューは、完全更新をサポートしています。定期更新と手動更新の両方のメソッドがサポートされています。マテリアライズドビューは、更新にバックグラウンドタスクメカニズムを使用します。インメモリー列指向インデックス (IMCI) と併用してクエリを高速化し、更新タスクの効率を向上させ、読み取り専用ノードの負荷を軽減できます。PolarDB の HTAP アーキテクチャ上に構築されたこの機能は、分析処理 (AP) 能力をさらに強化します。image.png

マテリアライズドビューは、直接クエリできるデータの物理的なコピーを含む点で、通常のビューとは異なります。マテリアライズドビューは、ビューとその基になる物理ベーステーブルで構成されます。

  • マテリアライズドビューの作成:ビューの作成とデータのマテリアライズは、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 クラスターパラメーターの変更方法は、コンソールとデータベースセッションで異なります。違いは次のとおりです:

  • PolarDB コンソール

    • 互換性:MySQL 設定ファイルとの互換性のため、PolarDB コンソールの一部のクラスターパラメーターには loose_ プレフィックスが付いています。

    • 手順loose_ プレフィックスが付いているパラメーターを見つけて変更します。

  • データベースセッション (コマンドラインまたはクライアントを使用) の場合

    • 手順SET コマンドを使用してデータベースセッションでパラメーターを変更する場合、loose_ プレフィックスを削除し、元のパラメーター名を使用します。

パラメーター

説明

loose_materialized_view_enabled

マテリアライズドビューを有効にするかどうかを指定します。有効な値:

  • ON (デフォルト):機能を有効にします。

  • OFF:機能を無効にします。

loose_enable_materialized_view_parallel

マテリアライズドビューのパラレルクエリ機能を有効にするかどうかを指定します。有効な値:

  • ON:有効。

  • OFF (デフォルト):無効。

マテリアライズドビューの作成

構文

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

いいえ

マテリアライズドビューに含める列。ビューの列に特定の名前を割り当てるには、column_list にカンマ (,) で区切って列挙します。

REFRESH

いいえ

マテリアライズドビューの更新ポリシーを指定します。

  • COMPLETE (デフォルト):完全更新。

  • FAST:増分更新。

説明

このトピックでは、完全更新ポリシーについて説明します。増分更新ポリシーの詳細については、「マテリアライズドビューの増分更新」をご参照ください。

ON

いいえ

マテリアライズドビューのマテリアライズタイプを指定します。

  • COMMIT:リアルタイムマテリアライズドビュー。

  • DEMAND (デフォルト):非同期マテリアライズドビュー。

説明

現在、非同期マテリアライズドビュータイプのみがサポートされています。

START WITH

いいえ

非同期マテリアライズドビューの自動更新の開始時刻。

NEXT

いいえ

非同期マテリアライズドビューの更新間隔。

説明

NEXT を指定しない場合、ビューは手動でのみ更新できます。

QUERY REWRITE

いいえ

マテリアライズドビューがクエリリライトをサポートするかどうかを指定します。

  • DISABLE (デフォルト):サポートされていません。

  • ENABLE:サポートされています。

説明

現在、クエリリライトはサポートされていません。

MATERIALIZED OPTIONS

いいえ

マテリアライズドビューの拡張パラメーターを指定します。値は文字列で、通常は JSON オブジェクトです。詳細については、「mv_options の使用方法」をご参照ください。

select_statement

はい

マテリアライズドビューのデータを定義するクエリ文。この文はベーステーブルからデータを取得し、結果をマテリアライズドビューに保存します。

mv_options の使用方法

mv_optionsMATERIALIZED 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_key

    STRING

    列名または式テキスト。

    マテリアライズドビューのコンテナテーブルの order_key を設定します。

    engine

    STRING

    • InnoDB

    • XEngine

    マテリアライズドビューのコンテナテーブルが使用するストレージエンジンを指定します。値の大文字と小文字は区別されません。

    table_format

    STRING

    • row

    • column

    コンテナテーブルの行ストアまたは列ストア形式を指定します。値の大文字と小文字は区別されません。

    • InnoDB エンジンは row のみをサポートします。

    • XEngine エンジンは rowcolumn の両方をサポートし、通常は engine: "xengine" と一緒に使用されます。

    refresh_policy

    STRING

    • 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_check

    INT

    • 1

    • 0

    XEngine 列ストアコンテナテーブルに使用されます。

    • 0 は更新中の一意性チェックを緩和します。

    • 1 またはフィールドを省略すると、デフォルトのチェックが維持されます。

    説明

    enginetable_formatrefresh_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;

  1. マテリアライズドビューのベーステーブルとして使用する table1table2 テーブルを作成します。

    -- ベーステーブルを作成します。
    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);
  2. マテリアライズドビューを作成します。

    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;
  3. 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

ビューが削除されたかどうかを示します。

  • 0:いいえ

  • 1:はい

FIRST_REFRESH_TIME

自動更新が設定されている場合、これは最初の更新の時刻です。

TIME_ZONE

タイムゾーン設定。

REFRESH_CONDITION

更新のトリガーメカニズム。

  • DEMAND:非同期更新。スケジュールに従って自動的に、または手動でトリガーされます。

  • COMMIT:リアルタイム更新。

REFRESH_STRATEGY

マテリアライズドビューの更新ポリシー。

  • COMPLETE:完全更新。

  • FAST:増分更新。

REFRESH_START_TIME

最初の更新に設定された開始時刻。

NEXT_TIME_EXPRESSION

非同期マテリアライズドビューの次の更新時刻の定義。

LAST_START_TIME

最後の更新が実際に開始された時刻。

LAST_END_TIME

最後の更新が実際に終了した時刻。

CONTAINER_TABLE_POSTFIX

データストレージに使用される物理テーブルのサフィックス。

EXPIRED_TABLE_POSTFIX

更新後に期限切れのデータを保持する物理テーブルのサフィックス。

IS_STOPPED

定期更新が停止しているかどうかを示します。

  • 0:いいえ

  • 1:はい

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>;

  1. 新しいテストデータを挿入します。

    INSERT INTO table1 VALUES (5, 'E', 500), (6, 'F', 600);
    INSERT INTO table2 VALUES (7, 'U', 60), (8, 'V', 70);
  2. マテリアライズドビューを手動で更新します。

    REFRESH MATERIALIZED VIEW mv1;
  3. マテリアライズドビューをクエリします。

    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;