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).
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
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
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
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. |
|
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.55atau lebih baru. -
MySQL 8.0.2, versi minor kernel
8.0.2.2.35atau lebih baru.
-
-
mv_optionsmendukung bidang berikut:Bidang
Type
Nilai
Deskripsi
order_keySTRING
Nama kolom atau teks ekspresi.
Menetapkan
order_keytabel kontainer tampilan yang di-materialisasi.engineSTRING
-
InnoDB -
XEngine
Menentukan mesin penyimpanan yang digunakan oleh tabel kontainer tampilan yang di-materialisasi. Nilainya tidak peka huruf besar/kecil.
table_formatSTRING
-
row -
column
Menentukan format penyimpanan baris atau kolom tabel kontainer. Nilainya tidak peka huruf besar/kecil.
-
Mesin
InnoDBhanya mendukungrow. -
Mesin
XEnginemendukungrowdancolumn, dan biasanya digunakan bersamaengine: "xengine".
refresh_policySTRING
-
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_checkINT
-
1 -
0
Digunakan untuk tabel kontainer penyimpanan kolom XEngine.
-
0merelaksasi pemeriksaan keunikan selama refresh. -
1atau menghilangkan bidang tetap menggunakan pemeriksaan default.
Catatanengine,table_format,refresh_policy, danunique_checksaat ini hanya didukung pada MySQL 8.0.2. -
-
Catatan:
-
MATERIALIZED OPTIONS = ''dianggap sebagai tidak ada parameter tambahan yang diatur. -
Saat
SHOW CREATE TABLEmenghasilkan definisi tampilan yang di-materialisasi, klausaMATERIALIZED OPTIONSyang dikonfigurasi disertakan. -
Lapisan sintaksis hanya menerima string. Jika parsing berikutnya gagal,
WARNINGdicatat 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
-
Buat tabel
table1dantable2untuk 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); -
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; -
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
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.
|
|
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 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.
|
|
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
-
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; -
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
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.
Kolom IS_STOPPED tidak tersedia di tampilan sistem information_schema.materialized_view_refresh_queue. Gunakan mysql.view_materialized_info sebagai gantinya.