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 melakukan kueri terhadap data yang telah dihitung sebelumnya. Pendekatan ini menghindari eksekusi ulang operasi yang memakan banyak sumber daya serta mempercepat kueri dengan menukar ruang penyimpanan demi waktu respons.
Tampilan yang di-materialisasi dalam kluster PolarDB for MySQL mendukung pembaruan penuh. Metode refresh terjadwal maupun manual didukung. Tampilan yang di-materialisasi menggunakan mekanisme tugas latar belakang untuk refresh. Anda dapat menggunakannya bersama IMCI untuk mempercepat kueri, yang meningkatkan efisiensi tugas refresh dan mengurangi beban pada node read-only. Berbasis arsitektur HTAP dari PolarDB, fitur ini lebih lanjut meningkatkan kemampuan pemrosesan analitik (AP).
Berbeda dari tampilan biasa, tampilan yang di-materialisasi berisi salinan fisik data yang dapat langsung dikueri. Tampilan ini terdiri atas tampilan itu sendiri dan tabel dasar fisik yang mendasarinya.
Membuat 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.
Menjalankan kueri pada tampilan yang di-materialisasi: Kueri pada tampilan yang di-materialisasi dieksekusi terhadap tabel dasar fisik yang mendasarinya.
Melakukan refresh pada tampilan yang di-materialisasi: Proses pembaruan penuh membuat tabel dasar fisik baru yang tersembunyi. 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 dalam memori untuk kueri.
Memantau dan mengelola tugas: Anda dapat melakukan kueri terhadap antrian tugas refresh latar belakang untuk melihat detail tugas. Anda juga dapat memantau dan mengelola tugas dengan menjeda atau me-restart 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
Menghindari perhitungan berulang: Untuk kueri kompleks yang memakan banyak sumber daya, hasil dihitung sekali dan digunakan berulang kali, sehingga secara signifikan meningkatkan efisiensi kueri.
Agregasi data di awal: Anda dapat melakukan agregasi data di awal 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.
Menghindari 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.
Agregasi data di awal: Dalam pembuatan laporan dan analitik data, tampilan yang di-materialisasi dapat melakukan agregasi data di awal, seperti data penjualan harian, mingguan, atau bulanan serta data perilaku pengguna. Menyimpan hasil perhitungan di awal mengurangi waktu dan sumber daya yang dibutuhkan untuk komputasi real-time.
Kueri yang dioptimalkan pada dataset besar: Melakukan kueri langsung terhadap volume besar data mentah bisa memakan waktu akibat pemindaian skala besar yang sering terjadi. 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
Metode untuk memodifikasi parameter kluster PolarDB berbeda antara konsol dan sesi database. Perbedaannya sebagai berikut:
Kompatibilitas: Untuk kompatibilitas dengan file konfigurasi MySQL, beberapa parameter kluster di PolarDB console 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
SETuntuk memodifikasi parameter di sesi database, hapus awalanloose_dan gunakan nama parameter aslinya.
Parameter | Deskripsi |
loose_materialized_view_enabled | Menentukan apakah tampilan yang di-materialisasi diaktifkan. Nilai yang valid:
|
loose_enable_materialized_view_parallel | Menentukan apakah fitur kueri paralel untuk tampilan yang di-materialisasi diaktifkan. Nilai yang valid:
|
Membuat tampilan yang di-materialisasi
Sintaks
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]
AS select_statementIzin
Izin
CREATEpada database tempat tampilan yang di-materialisasi berada.Izin
SELECTpada 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 |
REFRESH | Tidak | Menentukan kebijakan refresh untuk tampilan yang di-materialisasi.
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.
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.
Catatan Saat ini, penulisan ulang kueri tidak didukung. |
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. |
Contoh
Buat tabel
table1dantable2sebagai tabel dasar untuk 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);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;
Menjalankan kueri pada tampilan yang di-materialisasi
Menjalankan kueri pada tampilan yang di-materialisasi memerlukan izin SELECT untuk tampilan tersebut. Anda tidak memerlukan izin SELECT pada tabel dasar yang mendasari tampilan tersebut.
Menjalankan kueri pada tampilan yang di-materialisasi
SELECT * FROM mv1;Output yang diharapkan adalah:
+-----------+-----------+
| sum_value | avg_value |
+-----------+-----------+
| 600 | 200.0000 |
+-----------+-----------+Definisi tampilan kueri
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 |
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+Menjalankan kueri dari tabel sistem
SELECT * FROM mysql.view_materialized_info;Deskripsi field
Field | 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.
|
FIRST_REFRESH_TIME | Jika refresh otomatis dikonfigurasi, ini adalah waktu refresh pertama. |
TIME_ZONE | Pengaturan zona waktu. |
REFRESH_CONDITION | Mekanisme pemicu refresh.
|
REFRESH_STRATEGY | Kebijakan refresh untuk tampilan yang di-materialisasi.
|
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 saat refresh terakhir benar-benar dimulai. |
LAST_END_TIME | Waktu saat 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.
|
CREATE_TIME | Waktu saat metadata tampilan yang di-materialisasi dibuat. |
UPDATE_TIME | Waktu saat 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. Keunggulan utamanya adalah dukungan terhadap kueri SQL apa pun.
Tampilan yang di-materialisasi mendukung dua metode refresh: refresh manual dan refresh terjadwal.
Penyegaran Manual
Jika tampilan yang di-materialisasi tidak dikonfigurasi untuk refresh terjadwal, atau jika interval refresh panjang, Anda dapat menggunakan perintah REFRESH MATERIALIZED VIEW untuk merefresh data secara manual.
REFRESH MATERIALIZED VIEW <view_name>;Contoh
Masukkan data uji baru.
INSERT INTO table1 VALUES (5, 'E', 500), (6, 'F', 600); INSERT INTO table2 VALUES (7, 'U', 60), (8, 'V', 70);Refresh manual tampilan yang di-materialisasi.
REFRESH MATERIALIZED VIEW mv1;Lakukan kueri pada 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;Hapus tampilan yang di-materialisasi
Menghapus tampilan yang di-materialisasi memerlukan izin DROP pada database tempat tampilan tersebut berada.
Sintaks
DROP MATERIALIZED VIEW <view_name>;Contoh
DROP MATERIALIZED VIEW mv1;Memantau dan mengelola tugas
Refresh terjadwal tampilan yang di-materialisasi bergantung pada mekanisme penjadwalan otomatis sistem. Anda mungkin perlu memantau dan mengelola sejumlah besar tugas terjadwal. Anda dapat menjeda atau me-restart tugas refresh terjadwal untuk tampilan yang di-materialisasi pada tingkat tabel, database, atau global.
Menampilkan antrian tugas
Anda dapat melakukan kueri terhadap tampilan sistem information_schema.materialized_view_refresh_queue untuk melihat antrian refresh.
SELECT * FROM information_schema.materialized_view_refresh_queue;Menjeda 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;Mulai ulang 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;