All Products
Search
Document Center

PolarDB:Pembaruan penuh tampilan yang di-materialisasi

Last Updated:Sep 23, 2026

Tampilan yang di-materialisasi adalah objek database yang mengoptimalkan kueri kompleks dengan melakukan perhitungan awal dan menyimpan hasilnya. Dengan menyimpan hasil tersebut, Anda dapat langsung mengkueri data yang telah dihitung sebelumnya. Hal ini menghindari pengulangan operasi yang intensif sumber daya dan mempercepat kueri dengan menukar ruang penyimpanan demi waktu respons.

Materialized view di kluster PolarDB for MySQL mendukung pembaruan penuh, baik melalui metode terjadwal maupun manual. Materialized view menggunakan mekanisme tugas latar belakang untuk pembaruan. Fitur ini dapat digunakan bersama IMCI guna mempercepat kueri, meningkatkan efisiensi tugas pembaruan, serta mengurangi beban pada node read-only. Dibangun di atas arsitektur HTAP dari PolarDB, fitur ini semakin memperkuat kemampuan pemrosesan analitis (AP).image.png

Berbeda dari tampilan biasa, tampilan yang di-materialisasi berisi salinan fisik data yang dapat langsung dikueri. Tampilan ini terdiri dari tampilan itu sendiri dan tabel dasar fisik yang mendasarinya.

  • Buat tampilan yang di-materialisasi: Pembuatan tampilan dan materialisasi data merupakan dua langkah terpisah. Proses materialisasi adalah operasi asinkron yang didorong ke tugas latar belakang untuk mengisi tabel dasar fisik. Nama tabel dasar fisik dikaitkan dengan tampilan tersebut. Tugas materialisasi dan refresh mencakup operasi kueri dan insert. Operasi kueri dapat dialihkan ke node read-only dengan IMCI untuk mempercepat kueri dan mengurangi dampak pada node primary.

  • Kueri tampilan yang di-materialisasi: Kueri pada tampilan yang di-materialisasi dieksekusi terhadap tabel dasar fisik yang mendasarinya.

  • Refresh tampilan yang di-materialisasi: Proses pembaruan penuh membuat tabel dasar fisik baru yang disembunyikan. Setelah pernyataan refresh dieksekusi pada tabel tersembunyi tersebut, sistem menukar tabel dasar asli dan tersembunyi. Aksi ini memperbarui tabel metadata dengan informasi tabel dasar fisik terbaru dan menyinkronkannya dengan struktur in-memory untuk kueri.

  • Pemantauan dan manajemen tugas: Anda dapat mengkueri antrian tugas refresh latar belakang untuk melihat detail tugas. Anda juga dapat memantau dan mengelola tugas dengan menjeda atau merestart tugas refresh terjadwal untuk tampilan yang di-materialisasi pada tingkat tabel, database, atau global.

Persyaratan

Kluster PolarDB for MySQL Anda harus memenuhi salah satu persyaratan berikut:

  • MySQL 8.0.1, dan versi mesin minor harus 8.0.1.1.51 atau lebih baru.

  • MySQL 8.0.2, dan versi mesin minor harus 8.0.2.2.31 atau lebih baru.

Manfaat

  • Hindari perhitungan berulang: Untuk kueri kompleks yang intensif sumber daya, hasil dihitung sekali dan digunakan berulang kali, sehingga secara signifikan meningkatkan efisiensi kueri.

  • Pra-agregasi data: Anda dapat melakukan pra-agregasi data untuk laporan harian, mingguan, dan bulanan guna mempercepat pembuatan laporan dan analitik data.

  • Kueri yang dioptimalkan pada dataset besar: Mengurangi pemindaian langsung terhadap jumlah besar data mentah dan mempercepat waktu respons untuk kueri analitik.

  • Dukungan untuk analisis multidimensi: Anda dapat melakukan perhitungan awal data agregat untuk berbagai kombinasi dimensi guna memberikan dukungan efisien bagi skenario analisis multidimensi seperti OLAP.

Kasus penggunaan

Tampilan yang di-materialisasi mengoptimalkan performa kueri dengan melakukan perhitungan awal dan menyimpan hasil kueri. Fitur ini sangat berguna untuk memproses data skala besar dan kueri kompleks. Fitur ini mengurangi overhead komputasi real-time dan menyederhanakan logika kueri kompleks, sehingga ideal untuk pembuatan laporan cepat dan analitik data.

  • Hindari perhitungan berulang: Cocok untuk menyimpan hasil perhitungan intensif sumber daya yang sering dikueri. Penggunaan tampilan yang di-materialisasi menghindari perhitungan ulang data yang sama, sehingga secara signifikan meningkatkan efisiensi kueri.

  • Pra-agregasi data: Dalam pembuatan laporan dan analitik data, tampilan yang di-materialisasi dapat melakukan pra-agregasi data, seperti data penjualan dan data perilaku pengguna harian, mingguan, atau bulanan. Menyimpan hasil perhitungan sebelumnya mengurangi waktu dan sumber daya yang dibutuhkan untuk komputasi real-time.

  • Kueri yang dioptimalkan pada dataset besar: Mengkueri langsung volume besar data mentah bisa memakan waktu akibat pemindaian skala besar yang sering dilakukan. Tampilan yang di-materialisasi dapat mengurangi kebutuhan akses langsung ke data mentah, sehingga mempercepat kueri dan analisis.

  • Dukungan untuk analisis multidimensi: Tampilan yang di-materialisasi dapat melakukan perhitungan awal data agregat untuk berbagai kombinasi dimensi, memungkinkan respons kueri yang cepat dan efisien untuk analisis data multidimensi berbasis skenario.

Parameter

Parameter kluster PolarDB berbeda antara konsol dan sesi database. Perbedaannya sebagai berikut:

  • Di Konsol PolarDB:

    • Kompatibilitas: Untuk kompatibilitas dengan file konfigurasi MySQL, beberapa parameter kluster di Konsol PolarDB memiliki awalan loose_.

    • Prosedur: Temukan dan modifikasi parameter yang memiliki awalan loose_.

  • Di sesi database (menggunakan command line atau client)

    • Prosedur: Saat Anda menggunakan perintah SET untuk memodifikasi parameter di sesi database, hapus awalan loose_ dan gunakan nama parameter aslinya.

Parameter

Deskripsi

loose_materialized_view_enabled

Menentukan apakah tampilan yang di-materialisasi diaktifkan. Nilai yang valid:

  • ON (default): Mengaktifkan fitur.

  • OFF: Menonaktifkan fitur.

loose_enable_materialized_view_parallel

Menentukan apakah fitur kueri paralel untuk tampilan yang di-materialisasi diaktifkan. Nilai yang valid:

  • ON: Diaktifkan.

  • OFF (default): Dinonaktifkan.

Membuat tampilan yang di-materialisasi

Sintaksis

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

Izin

  • Izin CREATE pada database tempat tampilan yang di-materialisasi berada.

  • Izin SELECT pada kolom relevan (atau seluruh tabel) dari semua tabel dasar untuk tampilan yang di-materialisasi.

Parameter

Parameter

Wajib

Deskripsi

view_name

Ya

Nama tampilan yang di-materialisasi.

column_list

Tidak

Kolom yang akan disertakan dalam tampilan yang di-materialisasi. Untuk memberikan nama spesifik pada kolom tampilan, cantumkan dalam column_list, dipisahkan koma (,).

REFRESH

Tidak

Menentukan kebijakan refresh untuk tampilan yang di-materialisasi.

  • COMPLETE (default): Pembaruan penuh.

  • FAST: Pembaruan bertahap.

Catatan

Topik ini menjelaskan kebijakan pembaruan penuh. Untuk informasi tentang kebijakan pembaruan bertahap, lihat Pembaruan bertahap tampilan yang di-materialisasi.

ON

Tidak

Menentukan jenis materialisasi tampilan yang di-materialisasi.

  • COMMIT: Tampilan yang di-materialisasi real-time.

  • DEMAND (default): Tampilan yang di-materialisasi asinkron.

Catatan

Saat ini, hanya jenis tampilan yang di-materialisasi asinkron yang didukung.

START WITH

Tidak

Waktu mulai untuk refresh otomatis tampilan yang di-materialisasi asinkron.

NEXT

Tidak

Interval refresh untuk tampilan yang di-materialisasi asinkron.

Catatan

Jika Anda tidak menentukan NEXT, tampilan hanya dapat direfresh secara manual.

QUERY REWRITE

Tidak

Menentukan apakah tampilan yang di-materialisasi mendukung penulisan ulang kueri.

  • DISABLE (default): Tidak didukung.

  • ENABLE: Didukung.

Catatan

Saat ini, penulisan ulang kueri tidak didukung.

MATERIALIZED OPTIONS

Tidak

Menentukan parameter tambahan untuk tampilan yang di-materialisasi. Nilainya berupa string, biasanya objek JSON. Untuk detailnya, lihat penggunaan mv_options.

select_statement

Ya

Pernyataan kueri yang mendefinisikan data untuk tampilan yang di-materialisasi. Pernyataan ini mengambil data dari tabel dasar dan menyimpan hasilnya dalam tampilan yang di-materialisasi.

Penggunaan mv_options

mv_options ditentukan oleh klausa MATERIALIZED OPTIONS = 'json_options'. Klausa ini harus muncul sebelum AS select_statement, dan json_options harus berupa objek JSON yang valid.

  • Versi yang didukung:

    • MySQL 8.0.1, versi minor kernel 8.0.1.1.55 atau lebih baru.

    • MySQL 8.0.2, versi minor kernel 8.0.2.2.35 atau lebih baru.

  • mv_options mendukung bidang berikut:

    Bidang

    Type

    Nilai

    Deskripsi

    order_key

    STRING

    Nama kolom atau teks ekspresi.

    Menetapkan order_key tabel kontainer tampilan yang di-materialisasi.

    engine

    STRING

    • InnoDB

    • XEngine

    Menentukan mesin penyimpanan yang digunakan oleh tabel kontainer tampilan yang di-materialisasi. Nilainya tidak peka huruf besar/kecil.

    table_format

    STRING

    • row

    • column

    Menentukan format penyimpanan baris atau kolom tabel kontainer. Nilainya tidak peka huruf besar/kecil.

    • Mesin InnoDB hanya mendukung row.

    • Mesin XEngine mendukung row dan column, dan biasanya digunakan bersama engine: "xengine".

    refresh_policy

    STRING

    • MASTER

    • PREFER_TPRO

    • PREFER_IMCI

    • FORCE_TPRO

    • FORCE_IMCI

    • COST

    Menentukan kebijakan push-down untuk tugas pembaruan penuh. Nilainya tidak peka huruf besar/kecil. String kosong atau nilai yang tidak dikenal akan kembali ke kebijakan default yang ditentukan oleh variabel sistem.

    • MASTER: refresh pada node primary.

    • PREFER_TPRO: lebih memilih refresh pada node read-only (RO) penyimpanan baris. Refresh pada node primary jika tidak ada node RO penyimpanan baris.

    • PREFER_IMCI: lebih memilih refresh pada node RO indeks penyimpanan kolom. Refresh pada node primary jika tidak ada node RO indeks penyimpanan kolom.

    • FORCE_TPRO: memaksa refresh pada node RO penyimpanan baris. Laporkan error jika tidak ada node RO penyimpanan baris.

    • FORCE_IMCI: memaksa refresh pada node RO indeks penyimpanan kolom. Laporkan error jika tidak ada node RO indeks penyimpanan kolom.

    • COST: memilih antara node RO penyimpanan baris dan node RO indeks penyimpanan kolom berdasarkan biaya kueri untuk menjalankan refresh.

    unique_check

    INT

    • 1

    • 0

    Digunakan untuk tabel kontainer penyimpanan kolom XEngine.

    • 0 merelaksasi pemeriksaan keunikan selama refresh.

    • 1 atau menghilangkan bidang tetap menggunakan pemeriksaan default.

    Catatan

    engine, table_format, refresh_policy, dan unique_check saat ini hanya didukung pada MySQL 8.0.2.

  • Catatan:

    • MATERIALIZED OPTIONS = '' dianggap sebagai tidak ada parameter tambahan yang diatur.

    • Saat SHOW CREATE TABLE menghasilkan definisi tampilan yang di-materialisasi, klausa MATERIALIZED OPTIONS yang dikonfigurasi disertakan.

    • Lapisan sintaksis hanya menerima string. Jika parsing berikutnya gagal, WARNING dicatat dan pemrosesan dilanjutkan dengan perilaku default, seolah-olah tidak ada parameter yang diparsing.

  • Contoh:

    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;

Contoh

  1. Buat tabel table1 dan table2 untuk digunakan sebagai tabel dasar tampilan yang di-materialisasi.

    -- Buat tabel dasar.
    CREATE TABLE table1 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT);
    CREATE TABLE table2 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT);
    
    -- Masukkan data ke tabel dasar.
    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. Buat tampilan yang di-materialisasi.

    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. Buat tampilan yang di-materialisasi dengan 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;

Kueri tampilan yang di-materialisasi

Catatan

Mengkueri tampilan yang di-materialisasi memerlukan izin SELECT untuk tampilan tersebut. Anda tidak memerlukan izin SELECT pada tabel dasar yang mendasari tampilan tersebut.

Kueri tampilan yang di-materialisasi

SELECT * FROM mv1;

Output yang diharapkan adalah:

+-----------+-----------+
| sum_value | avg_value |
+-----------+-----------+
|       600 |  200.0000 |
+-----------+-----------+

Definisi Tampilan Query

SHOW CREATE VIEW mv1;

Output yang diharapkan adalah:

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

Kueri dari tabel sistem

SELECT * FROM mysql.view_materialized_info;

Deskripsi bidang

Bidang

Deskripsi

TABLE_SCHEMA

Nama database tempat tampilan yang di-materialisasi berada.

TABLE_NAME

Nama tampilan yang di-materialisasi.

IS_DROPPED

Menunjukkan apakah tampilan telah di-drop.

  • 0: Tidak

  • 1: Ya

FIRST_REFRESH_TIME

Jika refresh otomatis dikonfigurasi, ini adalah waktu refresh pertama.

TIME_ZONE

Pengaturan zona waktu.

REFRESH_CONDITION

Mekanisme pemicu refresh.

  • DEMAND: Refresh asinkron, yang dipicu secara otomatis sesuai jadwal atau secara manual.

  • COMMIT: Refresh real-time.

REFRESH_STRATEGY

Kebijakan refresh untuk tampilan yang di-materialisasi.

  • COMPLETE: Pembaruan penuh.

  • FAST: Pembaruan bertahap.

REFRESH_START_TIME

Waktu mulai yang dikonfigurasi untuk refresh pertama.

NEXT_TIME_EXPRESSION

Definisi untuk waktu refresh berikutnya dari tampilan yang di-materialisasi asinkron.

LAST_START_TIME

Waktu ketika refresh terakhir benar-benar dimulai.

LAST_END_TIME

Waktu ketika refresh terakhir benar-benar selesai.

CONTAINER_TABLE_POSTFIX

Akhiran tabel fisik yang digunakan untuk penyimpanan data.

EXPIRED_TABLE_POSTFIX

Akhiran tabel fisik yang menyimpan data kedaluwarsa setelah refresh.

IS_STOPPED

Menunjukkan apakah refresh terjadwal dihentikan.

  • 0: Tidak

  • 1: Ya

CREATE_TIME

Waktu ketika metadata tampilan yang di-materialisasi dibuat.

UPDATE_TIME

Waktu ketika metadata tampilan yang di-materialisasi terakhir diperbarui.

Output yang diharapkan adalah:

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

Refresh tampilan yang di-materialisasi

Saat ini, tampilan yang di-materialisasi hanya mendukung pembaruan penuh. Proses ini menggunakan metode out-of-place: membuat tabel dasar fisik tersembunyi, menjalankan pernyataan refresh di atasnya, lalu menukar tabel dasar asli dan tersembunyi. Oleh karena itu, pembaruan penuh memerlukan ruang penyimpanan tambahan. Keuntungan utamanya adalah mendukung kueri SQL apa pun.

Tampilan yang di-materialisasi mendukung dua metode refresh: refresh manual dan refresh terjadwal.

Refresh manual

Jika tampilan yang di-materialisasi tidak dikonfigurasi untuk refresh terjadwal, atau jika interval refresh-nya panjang, Anda dapat menggunakan perintah REFRESH MATERIALIZED VIEW untuk merefresh data secara manual.

REFRESH MATERIALIZED VIEW <view_name>;

Contoh

  1. Masukkan data uji baru.

    INSERT INTO table1 VALUES (5, 'E', 500), (6, 'F', 600);
    INSERT INTO table2 VALUES (7, 'U', 60), (8, 'V', 70);
  2. Refresh manual tampilan yang di-materialisasi.

    REFRESH MATERIALIZED VIEW mv1;
  3. Kueri tampilan yang di-materialisasi.

    SELECT * FROM mv1;

    Output yang diharapkan adalah:

    +-----------+-----------+
    | sum_value | avg_value |
    +-----------+-----------+
    |      1100 |  275.0000 |
    +-----------+-----------+

Refresh terjadwal

Saat membuat tampilan yang di-materialisasi, Anda dapat menentukan waktu mulai untuk refresh terjadwal menggunakan START WITH dan mengonfigurasi interval refresh otomatis menggunakan NEXT. Sistem secara otomatis menjadwalkan tugas refresh berdasarkan pengaturan yang ditentukan.

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 tampilan yang di-materialisasi

Catatan

Drop tampilan yang di-materialisasi memerlukan izin DROP pada database tempat tampilan yang di-materialisasi berada.

Sintaksis

DROP MATERIALIZED VIEW <view_name>;

Contoh

DROP MATERIALIZED VIEW mv1;

Pantau dan kelola tugas

Refresh terjadwal tampilan yang di-materialisasi bergantung pada mekanisme penjadwalan otomatis sistem. Anda mungkin perlu memantau dan mengelola banyak tugas terjadwal. Anda dapat menjeda atau merestart tugas refresh terjadwal untuk tampilan yang di-materialisasi pada tingkat tabel, database, atau global.

Lihat antrian tugas

Anda dapat mengkueri tampilan sistem information_schema.materialized_view_refresh_queue untuk melihat antrian refresh.

SELECT * FROM information_schema.materialized_view_refresh_queue;

Jeda antrian tugas

Berdasarkan tabel

STOP MATERIALIZED VIEW task FOR TABLE mv1;

Berdasarkan database

STOP MATERIALIZED VIEW task FOR DATABASE mv1;

Global

STOP MATERIALIZED VIEW task FOR ALL;

Restart antrian tugas

Berdasarkan tabel

RESTART MATERIALIZED VIEW task FOR TABLE mv1;

Berdasarkan database

RESTART MATERIALIZED VIEW task FOR DATABASE mv1;

Global

RESTART MATERIALIZED VIEW task FOR ALL;

Verifikasi status jeda atau restart

Setelah menjalankan perintah STOP atau RESTART, Anda dapat mengkueri kolom IS_STOPPED pada tabel mysql.view_materialized_info untuk memastikan apakah operasi telah berlaku:

SELECT TABLE_SCHEMA, TABLE_NAME, IS_STOPPED FROM mysql.view_materialized_info;
  • IS_STOPPED=1: Tugas refresh terjadwal dijeda.

  • IS_STOPPED=0: Tugas refresh terjadwal sedang berjalan.

Catatan

Kolom IS_STOPPED tidak tersedia di tampilan sistem information_schema.materialized_view_refresh_queue. Gunakan mysql.view_materialized_info sebagai gantinya.