Tampilan yang di-materialisasi adalah objek basis data yang mengoptimalkan performa kueri kompleks dengan memprakalkulasi dan menyimpan hasil kueri, sehingga Anda dapat langsung melakukan kueri terhadap data yang telah diprakalkulasi tanpa menjalankan ulang operasi intensif sumber daya tersebut. Pendekatan ini menukar ruang penyimpanan dengan waktu guna mempercepat kueri.
Kluster PolarDB for MySQL kini mendukung pembaruan penuh tampilan yang di-materialisasi, baik secara terjadwal maupun manual. Tampilan yang di-materialisasi menggunakan tugas latar belakang untuk memperbarui data dan dapat digunakan bersama In-Memory Column Index (IMCI) guna mempercepat kueri. Hal ini meningkatkan efisiensi pembaruan serta mengurangi beban pada node read-only, sekaligus memperkuat kemampuan pemrosesan analitik (AP) dalam arsitektur pemrosesan transaksional dan analitik hibrida (HTAP) PolarDB.
Perbedaan utama antara tampilan yang di-materialisasi dan tampilan biasa terletak pada fakta bahwa tampilan yang di-materialisasi menyimpan salinan fisik data, sehingga memungkinkan kueri langsung terhadapnya. Tampilan yang di-materialisasi terdiri atas tampilan itu sendiri dan tabel dasar fisik yang mendasarinya.
Buat tampilan yang di-materialisasi: Pembuatan tabel dan materialisasi merupakan dua langkah terpisah. Materialisasi adalah operasi asinkron yang dijalankan sebagai tugas latar belakang untuk membuat tabel dasar fisik. Nama tabel dasar fisik tersebut kemudian dikaitkan dengan tampilan. Bagian kueri dari tugas pembaruan dapat dialihkan ke node read-only IMCI, sehingga mempercepat kueri dan mengurangi dampak pada node primary.
Lakukan kueri terhadap tampilan yang di-materialisasi: Kueri dilakukan dengan menggabungkan tampilan dan tabel dasar fisik untuk mengakses data dalam tabel dasar fisik tersebut.
Perbarui tampilan yang di-materialisasi: Pembaruan penuh membuat tabel dasar fisik tersembunyi baru. Setelah pernyataan pembaruan dieksekusi pada tabel dasar tersembunyi tersebut, tabel dasar asli dan tersembunyi ditukar. Proses ini memperbarui tabel metadata dengan informasi tabel dasar fisik terbaru dan menyelaraskannya dengan struktur dalam memori untuk kueri.
Pantau dan kelola tugas: Anda dapat melakukan kueri terhadap informasi antrian tugas pembaruan latar belakang dan mengelola tugas-tugas tersebut, termasuk menangguhkan atau me-restart tugas pembaruan terjadwal untuk tabel tertentu, basis data, atau secara global.
Penerapan
Kluster PolarDB for MySQL Anda harus memenuhi salah satu persyaratan berikut:
Kluster menjalankan MySQL 8.0.1, dan versi mesin minor adalah 8.0.1.1.51 atau lebih baru.
Kluster menjalankan MySQL 8.0.2, dan versi mesin minor adalah 8.0.2.2.31 atau lebih baru.
Keunggulan
Menghindari perhitungan berulang: Untuk kueri kompleks yang intensif sumber daya, Anda cukup melakukan perhitungan sekali dan menggunakan ulang hasilnya berkali-kali, sehingga efisiensi kueri meningkat signifikan.
Pragregasi data: Anda dapat melakukan pra-agregasi data untuk laporan, seperti laporan harian, mingguan, dan bulanan, sehingga mempercepat pembuatan laporan dan analitik data.
Mengoptimalkan kueri data besar: Tampilan yang di-materialisasi mengurangi pemindaian langsung terhadap volume besar data mentah, sehingga mempercepat waktu respons untuk kueri analitik.
Mendukung analisis multidimensi: Tampilan yang di-materialisasi dapat memprakalkulasi data agregat untuk berbagai kombinasi dimensi, memberikan dukungan efisien untuk Pemrosesan Analitik Online (OLAP) dan skenario analisis multidimensi lainnya.
Skenario
Tampilan yang di-materialisasi mengoptimalkan performa kueri dengan memprakalkulasi dan menyimpan hasil kueri. Fitur ini sangat berguna dalam skenario yang melibatkan data skala besar dan kueri kompleks karena mengurangi overhead komputasi real-time serta menyederhanakan logika kueri. Tampilan yang di-materialisasi banyak digunakan untuk pembuatan laporan cepat dan analitik data.
Menghindari perhitungan berulang: Tampilan yang di-materialisasi cocok untuk menyimpan hasil perhitungan kompleks dan intensif sumber daya yang sering dikueri, sehingga menghindari penghitungan ulang data yang sama dan meningkatkan efisiensi kueri secara signifikan.
Pragregasi data: Dalam skenario seperti pembuatan laporan dan analitik data, tampilan yang di-materialisasi dapat melakukan pra-agregasi data, seperti data penjualan harian, mingguan, atau bulanan serta data perilaku pengguna. Hasil perhitungan yang telah disimpan mengurangi waktu dan sumber daya yang dibutuhkan untuk komputasi real-time.
Mengoptimalkan kueri data besar: Ketika skenario bisnis Anda melibatkan analisis volume data besar, kueri langsung terhadap data mentah dapat memakan waktu akibat pemindaian besar-besaran. Tampilan yang di-materialisasi mengurangi kebutuhan akses langsung ke data mentah, sehingga mempercepat kueri dan analisis.
Mendukung analisis multidimensi: Tampilan yang di-materialisasi dapat memprakalkulasi data agregat untuk berbagai kombinasi dimensi, memberikan respons kueri yang efisien dan cepat dalam skenario analisis data multidimensi.
Deskripsi metrik
Metode untuk mengubah parameter kluster PolarDB berbeda antara Konsol dan sesi database, sebagai berikut:
Kompatibilitas: Untuk kompatibilitas dengan file konfigurasi MySQL, beberapa parameter kluster di Konsol PolarDB memiliki awalan loose_.
Prosedur: Temukan dan ubah parameter yang memiliki awalan
loose_.
Di sesi database (menggunakan command line atau client)
Prosedur: Saat menggunakan perintah
SETuntuk mengubah parameter dalam sesi database, hapus awalanloose_dan gunakan nama parameter aslinya.
Parameter | Deskripsi |
loose_materialized_view_enabled | Mengaktifkan atau menonaktifkan tampilan yang di-materialisasi. Nilai yang valid:
|
loose_enable_materialized_view_parallel | Menentukan apakah akan mengaktifkan kueri paralel untuk tampilan yang di-materialisasi. Nilai yang valid:
|
Buat 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]
AS select_statementIzin
Izin
CREATEpada basis data tempat tampilan yang di-materialisasi akan ditempatkan.Izin
SELECTpada kolom terkait 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 ditentukan untuk tampilan yang di-materialisasi. Jika Anda ingin memberikan nama spesifik untuk kolom dalam tampilan, Anda dapat menentukan nama kolom dalam |
REFRESH | Tidak | Menentukan kebijakan pembaruan untuk tampilan yang di-materialisasi.
Catatan Saat ini, hanya kebijakan pembaruan penuh yang didukung. |
ON | Tidak | Menentukan jenis materialisasi tampilan yang di-materialisasi.
Catatan Saat ini, hanya jenis materialisasi asinkron yang didukung. |
START WITH | Tidak | Waktu mulai untuk pembaruan otomatis dari tampilan yang di-materialisasi secara asinkron. |
NEXT | Tidak | Interval pembaruan untuk tampilan yang di-materialisasi secara asinkron. Catatan Jika NEXT tidak didefinisikan, Anda hanya dapat memperbarui tampilan 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;
Mengkueri Tampilan yang di-materialisasi
Untuk melakukan kueri terhadap tampilan yang di-materialisasi, Anda harus memiliki izin SELECT pada tampilan tersebut. Anda tidak memerlukan izin SELECT pada tabel dasar yang dirujuk oleh tampilan yang di-materialisasi.
Lakukan kueri terhadap tampilan yang di-materialisasi
SELECT * FROM mv1;Hasil yang diharapkan:
+-----------+-----------+
| sum_value | avg_value |
+-----------+-----------+
| 600 | 200.0000 |
+-----------+-----------+Lihat definisi tampilan yang di-materialisasi
SHOW CREATE VIEW mv1;Hasil yang diharapkan:
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| 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 |
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+Gunakan tabel sistem untuk melakukan kueri informasi tampilan yang di-materialisasi
SELECT * FROM mysql.view_materialized_info;Deskripsi Bidang
Bidang | Deskripsi |
TABLE_SCHEMA | Nama basis data tempat tampilan yang di-materialisasi berada. |
TABLE_NAME | Nama tampilan yang di-materialisasi. |
IS_DROPPED | Menunjukkan apakah tampilan telah dihapus.
|
FIRST_REFRESH_TIME | Jika pembaruan otomatis dikonfigurasi, ini adalah waktu pembaruan pertama. |
TIME_ZONE | Pengaturan zona waktu. |
REFRESH_CONDITION | Mekanisme pemicu pembaruan.
|
REFRESH_STRATEGY | Kebijakan pembaruan untuk tampilan yang di-materialisasi.
|
REFRESH_START_TIME | Waktu saat pembaruan dimulai. |
NEXT_TIME_EXPRESSION | Definisi waktu pembaruan berikutnya untuk tampilan yang di-materialisasi asinkron. |
LAST_START_TIME | Waktu ketika pembaruan terakhir benar-benar dimulai. |
LAST_END_TIME | Waktu ketika pembaruan terakhir benar-benar berakhir. |
CONTAINER_TABLE_POSTFIX | Akhiran tabel fisik untuk penyimpanan data. |
EXPIRED_TABLE_POSTFIX | Akhiran tabel fisik kedaluwarsa berikutnya untuk penyimpanan data. |
IS_STOPPED | Menunjukkan apakah pembaruan terjadwal dihentikan.
|
CREATE_TIME | Waktu saat metadata tampilan yang di-materialisasi dibuat. |
UPDATE_TIME | Waktu saat metadata tampilan yang di-materialisasi diperbarui. |
Hasil yang diharapkan:
+-----+--------------+------------+------------+---------------------+-----------+-------------------+------------------+---------------------+---------------------------+---------------------+---------------------+-------------------------+-----------------------+------------+---------------------+---------------------+
| 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 |
+-----+--------------+------------+------------+---------------------+-----------+-------------------+------------------+---------------------+---------------------------+---------------------+---------------------+-------------------------+-----------------------+------------+---------------------+---------------------+Perbarui tampilan yang di-materialisasi
Saat ini, tampilan yang di-materialisasi hanya mendukung pembaruan penuh. Proses ini menggunakan metode out-of-place, di mana tabel dasar fisik tersembunyi dibuat, pernyataan pembaruan dieksekusi padanya, lalu tabel dasar asli dan tersembunyi ditukar. Oleh karena itu, operasi pembaruan penuh memerlukan ruang penyimpanan tambahan. Keunggulan utama metode ini adalah mendukung kueri SQL apa pun.
Tampilan yang di-materialisasi mendukung dua metode pembaruan: pembaruan manual dan pembaruan terjadwal.
Pembaruan Manual
Jika tampilan yang di-materialisasi tidak dikonfigurasi untuk pembaruan terjadwal, atau jika interval pembaruan panjang, Anda dapat menggunakan perintah REFRESH MATERIALIZED VIEW untuk memperbarui 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);Perbarui tampilan yang di-materialisasi secara manual.
REFRESH MATERIALIZED VIEW mv1;Tanyai tampilan yang di-materialisasi.
SELECT * FROM mv1;Hasil yang diharapkan:
+-----------+-----------+ | sum_value | avg_value | +-----------+-----------+ | 1100 | 275.0000 | +-----------+-----------+
Pembaruan Terjadwal
Saat membuat tampilan yang di-materialisasi, Anda dapat menetapkan waktu mulai pembaruan terjadwal dengan START WITH dan mengonfigurasi interval pembaruan otomatis dengan NEXT. Sistem secara otomatis menjadwalkan pembaruan berdasarkan waktu yang dikonfigurasi.
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
Untuk menghapus tampilan yang di-materialisasi, Anda harus memiliki izin DROP pada basis data tempat tampilan tersebut berada.
Sintaksis
DROP MATERIALIZED VIEW <view_name>;Contoh
DROP MATERIALIZED VIEW mv1;Pantau dan kelola tugas pembaruan terjadwal
Pembaruan terjadwal tampilan yang di-materialisasi bergantung pada mekanisme penjadwalan otomatis sistem. Jika terdapat terlalu banyak tugas terjadwal, Anda dapat memantau dan mengelolanya dengan menangguhkan atau me-restart tugas pembaruan terjadwal untuk tampilan yang di-materialisasi pada tingkat tabel, basis data, atau global.
Lihat antrian tugas
Anda dapat menggunakan tampilan sistem information_schema.materialized_view_refresh_queue untuk melakukan kueri informasi antrian pembaruan.
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;Secara 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;Secara global
RESTART MATERIALIZED VIEW task FOR ALL;