Tampilan materialisasi bertahap (Incremental Materialized View/IVM) merupakan bentuk lanjutan dari tampilan materialisasi. Berbeda dengan pembaruan penuh (full refresh) yang menghitung ulang seluruh kueri, pembaruan bertahap hanya menerapkan perubahan data (INSERT, UPDATE, dan DELETE) dari tabel dasar ke tampilan tersebut. Proses yang hampir real-time ini secara signifikan mengurangi beban sistem dan latensi data.
Cara kerja
Prinsip inti tampilan materialisasi bertahap adalah memproses hanya data yang berubah, bukan seluruh set data.
Ketika operasi INSERT, UPDATE, atau DELETE terjadi pada tabel dasar, sistem secara otomatis mencatat perubahan tersebut. Proses ini berjalan secara efisien pada node penyimpanan kolom In-Memory Columnar Index (IMCI), tanpa memerlukan binlog atau trigger, serta tidak mengunci tabel dasar.
FAST (incremental refresh): Memproses hanya data yang berubah sejak pembaruan terakhir, sehingga menghasilkan kecepatan tinggi dan overhead rendah.
COMPLETE (full refresh): Menghitung ulang seluruh kueri. Cocok untuk pengisian data awal atau koreksi data.
Prasyarat
Untuk menggunakan tampilan materialisasi bertahap, sistem Anda harus memenuhi persyaratan berikut:
Kluster: Kluster PolarDB for MySQL Anda harus memenuhi salah satu persyaratan berikut:
MySQL 8.0.2 dengan versi kernel minor 8.0.2.2.35 atau lebih baru.
Parameter In-Memory Columnar Index (IMCI):
Parameter
Default
Nilai
Deskripsi
imci_enable_window_function
2
>= 2
Mengaktifkan dukungan untuk fungsi jendela IMCI.
imci_enable_nci_async_pre_commit
OFF
OFF
Menonaktifkan NCI async pre-commit untuk memastikan konsistensi data bertahap.
CatatanParameter ini secara default bernilai OFF dan saat ini tidak dapat diubah.
imci_enable_hybrid_plan
ON
OFF
Menonaktifkan rencana eksekusi hibrida untuk memaksa pembaruan bertahap dieksekusi pada node penyimpanan kolom read-only.
CatatanAnda dapat mengubah parameter-parameter ini di PolarDB console.
Manfaat utama
Manfaat | Deskripsi |
Sinkronisasi data berlatensi rendah | Menjaga data tampilan tetap sinkron dengan tabel dasar dengan latensi minimal, mengurangi waktu refresh dari menit menjadi detik bahkan milidetik. Menghindari pemindaian tabel penuh dengan hanya memproses perubahan bertahap. |
Beban sistem berkurang | Secara signifikan mengurangi konsumsi CPU, memori, dan I/O. Manfaat ini terutama terasa dalam skenario dengan tabel dasar besar namun volume perubahan kecil. |
Pemanfaatan IMCI yang mulus | Komputasi bertahap berjalan pada node penyimpanan kolom IMCI, memanfaatkan sepenuhnya kemampuan agregasi berkecepatan tinggi dari penyimpanan kolom. |
Akselerasi kueri analitis | Memberikan waktu respons tingkat milidetik untuk kueri agregasi dan join kompleks dalam skenario HTAP (Hybrid Transactional/Analytical Processing). |
Pemeliharaan latar belakang otomatis | Sistem secara otomatis mengelola siklus hidup log bertahap (tabel delta). |
Kasus penggunaan
Pra-komputasi untuk analisis: Pra-proses join multi-tabel kompleks menjadi tabel lebar untuk menghindari operasi join mahal pada setiap kueri.
Akselerasi laporan: Menyediakan data pra-komputasi untuk laporan gudang data atau BI real-time, mengurangi overhead pembaruan lebih dari 90% dengan pembaruan bertahap.
Penggunaan ulang komputasi: Gunakan kembali hasil komputasi dengan membuat tampilan materialisasi bersarang.
Gudang data real-time: Mendukung kueri analitis yang mencerminkan perubahan tabel dasar hampir secara real-time.
Beban kerja HTAP: Menyinkronkan data OLTP yang sering diperbarui ke tampilan analitis dengan latensi rendah, memisahkan beban kerja TP dan AP.
Batasan
Batasan umum:
Sintaksis yang tidak didukung: Pembaruan bertahap tidak didukung untuk kueri yang mengandung subkueri,
UNION,ORDER BY,LIMIT, fungsi jendela,HAVING,ROLLUP, atauCTE.UNION ALL: Saat ini tidak didukung.Persyaratan tabel dasar:
Tabel dasar harus memiliki IMCI aktif (
polar_enable_imci = ON), dan semua kolom dalam tabel dasar harus disertakan dalam IMCI.Tabel dasar tidak boleh berupa tampilan standar atau tampilan materialisasi non-bertahap. Tampilan materialisasi bersarang diperbolehkan, asalkan tampilan dalamnya juga mendukung pembaruan bertahap.
Overhead penyimpanan:
Tampilan materialisasi menyimpan salinan data, yang mengonsumsi ruang penyimpanan tambahan.
Sistem juga mengonsumsi penyimpanan tambahan untuk mencatat perubahan guna pembaruan bertahap. Penggunaan penyimpanan ini tidak bertambah tanpa batas karena data usang secara berkala diklaim kembali.
Batasan untuk filter satu tabel:
Tabel dasar harus memiliki primary key eksplisit.
Kata kunci
DISTINCTtidak didukung.
Batasan untuk agregasi satu tabel:
Tabel dasar harus memiliki primary key eksplisit.
Klausa
GROUP BYharus mereferensikan kolom tunggal dan tidak boleh menggunakan ekspresi. Misalnya,GROUP BY YEAR(create_time)tidak didukung; Anda harus mengubahnya menjadiGROUP BY create_year.Fungsi agregat yang didukung:
COUNT,SUM, danAVG.Fungsi agregat yang tidak didukung:
STDDEV,VARIANCE,MIN, danMAX.Agregasi tanpa klausa
GROUP BYsaat ini tidak didukung.Agregasi multi-tabel saat ini tidak didukung.
Batasan untuk join multi-tabel
Semua tabel dasar harus memiliki primary key eksplisit.
RIGHT JOINtidak didukung.Join harus mengikuti struktur pohon left-deep. Struktur bersarang seperti
A JOIN (B LEFT JOIN C) JOIN Dtidak diperbolehkan.Kondisi ON untuk setiap tabel harus menyertakan kolom dari tabel lain. Sintaksis seperti
A JOIN B ON B.id = 1tidak diperbolehkan.
Sintaksis
CREATE MATERIALIZED VIEW mv_name
[REFRESH [COMPLETE | FAST] [ON DEMAND]]
[START WITH now()] [NEXT now() + interval 5 second]
AS SELECT ... FROM base_table;FAST: Menentukan mode pembaruan bertahap, yang hanya memproses perubahan dari tabel dasar.COMPLETE: Menentukan mode pembaruan penuh, yang menghitung ulang seluruh kueri setiap kali.ON DEMAND: Menentukan pembaruan berdasarkan permintaan, yang harus dipicu secara manual atau oleh interval pembaruan latar belakang yang telah ditentukan.
Contoh
Contoh 1: Filter satu tabel (tipe FILTER)
Buat tabel dasar dengan indeks kolom diaktifkan.
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, c3 INT) COMMENT 'COLUMNAR=1'; INSERT INTO t1 VALUES (1, 1, 1);Buat tampilan materialisasi bertahap.
CREATE MATERIALIZED VIEW mv_filter REFRESH FAST ON DEMAND AS SELECT * FROM t1 WHERE c2 < 5;Lakukan pembaruan penuh untuk mengisi data awal.
REFRESH MATERIALIZED VIEW mv_filter;Lakukan pembaruan bertahap setelah data tabel dasar berubah.
-- Ubah tabel dasar INSERT INTO t1 VALUES (2, 2, 3); DELETE FROM t1 WHERE c1 = 1; -- Lakukan pembaruan bertahap untuk memproses hanya perubahan di atas REFRESH MATERIALIZED VIEW mv_filter;
Contoh 2: Statistik agregasi (tipe AGGREGATE)
-- Buat tabel dasar dengan indeks kolom diaktifkan
CREATE TABLE orders (
order_id INT PRIMARY KEY, -- ID pesanan unik (primary key)
user_id INT NOT NULL, -- ID pengguna (kolom GROUP BY)
amount DECIMAL(12, 2) NOT NULL, -- Jumlah pesanan (kolom agregasi)
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Waktu pesanan (bidang bisnis standar)
)COMMENT 'COLUMNAR=1';
-- Statistik agregasi
CREATE MATERIALIZED VIEW mv_user_order_stats
REFRESH FAST ON DEMAND
AS SELECT
user_id,
COUNT(*) AS order_count,
SUM(amount * 2) AS total_amount,
AVG(CAST(amount AS INT)) AS avg_amount
FROM orders
GROUP BY user_id;Fungsi agregat yang didukung: COUNT(*), COUNT(expr), SUM(expr), dan AVG(expr).
Contoh 3: INNER JOIN multi-tabel
Buat tabel dasar.
CREATE TABLE t4 (id4 INT PRIMARY KEY, c2 INT, c3 VARCHAR(50)) COMMENT 'COLUMNAR=1'; CREATE TABLE t5 (id5 INT PRIMARY KEY, c2 INT, c3 VARCHAR(50)) COMMENT 'COLUMNAR=1'; CREATE TABLE t6 (id6 INT PRIMARY KEY, c2 INT, c3 VARCHAR(50)) COMMENT 'COLUMNAR=1'; INSERT INTO t4 VALUES (1, 10, 'A'), (2, 20, 'B'), (3, 30, 'C'); INSERT INTO t5 VALUES (1, 100, 'X'), (2, 200, 'Y'), (4, 400, 'Z'); INSERT INTO t6 VALUES (1, 1000, 'P'), (2, 2000, 'Q'), (3, 3000, 'R');Buat tampilan materialisasi bertahap untuk INNER JOIN multi-tabel.
CREATE MATERIALIZED VIEW mv_inner_with_where_on REFRESH FAST ON DEMAND AS SELECT t4.id4, t4.c2, t5.id5, t5.c2 AS t5_c2, t6.id6, t6.c2 AS t6_c2 FROM t4 INNER JOIN t5 ON t4.id4 = t5.id5 INNER JOIN t6 ON t4.id4 = t6.id6 WHERE t4.c2 > 5 AND t5.c2 > 50;Lakukan pembaruan penuh dan verifikasi.
-- Lakukan pembaruan penuh untuk mengisi data awal REFRESH MATERIALIZED VIEW mv_inner_with_where_on; -- Ubah tabel dasar INSERT INTO t4 VALUES (4, 40, 'D'); INSERT INTO t6 VALUES (4, 4000, 'S'); UPDATE t4 SET c2 = 15 WHERE id4 = 1; DELETE FROM t5 WHERE id5 = 4; INSERT INTO t5 VALUES (5, 400, 'W'); -- Lakukan pembaruan bertahap REFRESH MATERIALIZED VIEW mv_inner_with_where_on;
Contoh 4: LEFT JOIN
-- Buat tabel dasar dengan indeks kolom diaktifkan
-- Buat tabel produk (tabel yang digabungkan / tabel kanan)
CREATE TABLE products (
product_id INT PRIMARY KEY, -- Kunci join, harus primary key
product_name VARCHAR(100) NOT NULL, -- Nama produk
price DECIMAL(10, 2) -- Bidang bisnis lainnya
) COMMENT 'COLUMNAR=1';
-- Buat tabel item pesanan (tabel utama / tabel kiri)
CREATE TABLE order_items (
item_id INT PRIMARY KEY, -- ID item, harus primary key
order_id INT NOT NULL, -- ID pesanan
product_id INT, -- Kunci join, bisa NULL (karena ini LEFT JOIN)
quantity INT NOT NULL, -- Jumlah pembelian
FOREIGN KEY (product_id) REFERENCES products(product_id) -- Kendala kunci asing opsional
) COMMENT 'COLUMNAR=1';
-- LEFT JOIN
CREATE MATERIALIZED VIEW mv_order_with_product
REFRESH FAST ON DEMAND
AS SELECT
oi.item_id,
oi.order_id,
p.product_name,
oi.quantity
FROM order_items oi
LEFT JOIN products p ON oi.product_id = p.product_id;Contoh 5: Tampilan materialisasi bersarang (penggunaan ulang komputasi)
Tampilan materialisasi bersarang dibangun di atas tampilan materialisasi bertahap lainnya, memungkinkan Anda menggunakan kembali hasil komputasi. Misalnya, Anda dapat terlebih dahulu memfilter data valid dari tabel dasar, lalu melakukan agregasi pada hasil yang telah difilter. Selama pembaruan, setiap lapisan hanya memproses perubahan bertahap masing-masing.
Buat tabel dasar.
CREATE TABLE order_log ( order_id INT PRIMARY KEY, user_id INT, product_category VARCHAR(50), amount DECIMAL(10,2), status VARCHAR(20), created_year INT ) COMMENT 'COLUMNAR=1'; INSERT INTO order_log VALUES (1, 101, 'electronics', 299.00, 'paid', 2025), (2, 102, 'clothing', 59.90, 'paid', 2025), (3, 103, 'electronics', 499.00, 'cancelled', 2025), (4, 101, 'clothing', 120.00, 'paid', 2025), (5, 104, 'electronics', 89.00, 'paid', 2025);Buat tampilan materialisasi bertahap tingkat pertama untuk memfilter pesanan yang telah dibayar.
CREATE MATERIALIZED VIEW mv_paid_orders REFRESH FAST ON DEMAND AS SELECT order_id, user_id, product_category, amount, created_year FROM order_log WHERE status = 'paid';Lakukan pembaruan penuh untuk mengisi data awal.
REFRESH MATERIALIZED VIEW mv_paid_orders;Buat tampilan materialisasi bertahap tingkat kedua untuk mengagregasi statistik berdasarkan kategori, berdasarkan tampilan tingkat pertama.
CREATE MATERIALIZED VIEW mv_category_revenue REFRESH FAST ON DEMAND AS SELECT product_category, COUNT(*) AS order_count, SUM(amount) AS total_revenue FROM mv_paid_orders GROUP BY product_category;Lakukan pembaruan penuh untuk mengisi data awal.
REFRESH MATERIALIZED VIEW mv_category_revenue;Setelah data tabel dasar berubah, lakukan pembaruan bertahap untuk setiap tingkat secara berurutan.
-- Tambahkan data baru ke tabel dasar INSERT INTO order_log VALUES (6, 105, 'electronics', 199.00, 'paid', 2025), (7, 106, 'clothing', 75.00, 'cancelled', 2025); -- Refresh sesuai urutan dependensi: tingkat pertama, lalu tingkat kedua REFRESH MATERIALIZED VIEW mv_paid_orders; REFRESH MATERIALIZED VIEW mv_category_revenue; -- Verifikasi hasil: order_id=7 difilter oleh tingkat pertama karena statusnya 'cancelled' -- dan tidak akan dimasukkan dalam statistik tingkat kedua. SELECT * FROM mv_category_revenue;
Untuk memastikan konsistensi data, Anda harus melakukan refresh tampilan materialisasi bersarang sesuai urutan dependensinya, dari tampilan dasar ke tampilan tingkat atas. Tampilan materialisasi yang mendasari harus bertipe pembaruan bertahap (REFRESH FAST).
Lakukan pembaruan bertahap
Untuk memicu pembaruan secara manual, jalankan perintah berikut:
REFRESH MATERIALIZED VIEW mv_name;Pembaruan bertahap hanya memproses perubahan yang terjadi pada tabel dasar sejak pembaruan terakhir, sehingga cepat dan ber-overhead rendah tanpa memerlukan pemindaian tabel penuh.
Ketika Anda menjalankan REFRESH MATERIALIZED VIEW untuk pertama kalinya, sistem secara otomatis melakukan pembaruan penuh untuk mengisi data awal. Pembaruan berikutnya bersifat bertahap.
Hapus tampilan materialisasi
DROP MATERIALIZED VIEW mv_name;Setelah Anda menghapus tampilan materialisasi, sistem secara otomatis membersihkan tabel delta yang sesuai jika parameter delta_mv_auto_cleanup = ON diaktifkan (default).
Manajemen dan pemantauan
Daftar tampilan materialisasi
SELECT
table_name,
table_schema,
base_tables,
first_refresh_time,
refresh_strategy,
last_start_time,
last_end_time
FROM mysql.view_materialized_info
WHERE refresh_strategy = 'FAST';Semua tampilan materialisasi
SELECT * FROM mysql.view_materialized_info;Segarkan Antrian Tugas
SELECT * FROM information_schema.materialized_view_refresh_queue;FAQ
Bagaimana cara memverifikasi pembaruan bertahap?
Gunakan pernyataan berikut untuk memverifikasi bahwa refresh_strategy bernilai FAST. Anda juga dapat memeriksa kolom last_refresh_status untuk melihat hasil refresh terbaru.
SELECT table_name, refresh_strategy, last_start_time, last_end_time
FROM mysql.view_materialized_info;Kapan tampilan materialisasi diperbarui?
Sebelum dilakukan refresh, data tampilan mencerminkan kondisinya pada saat refresh terakhir. Untuk memperbarui data, Anda harus menjalankan secara manual REFRESH MATERIALIZED VIEW mv_name.
Apakah tabel dasar dikunci selama refresh?
Tidak. Anda dapat terus melakukan operasi baca dan tulis normal pada tabel dasar selama pembaruan bertahap tanpa dampak apa pun.
Apakah agregasi didukung untuk pembaruan bertahap?
Pembaruan bertahap saat ini didukung untuk agregasi satu tabel. Agregasi multi-tabel dan UNION ALL saat ini tidak didukung.
Berapa interval refresh minimum?
Interval refresh minimum saat ini adalah 1 detik.