Una vista materializada incremental (IVM) es una versión avanzada de la vista materializada. A diferencia de una actualización completa que vuelve a calcular toda la consulta, una actualización incremental solo aplica a la vista los cambios de datos (INSERT, UPDATE y DELETE) de las tablas base. Este proceso casi en tiempo real reduce significativamente la carga del sistema y la latencia de los datos.
Funcionamiento
El principio fundamental de una vista materializada incremental consiste en procesar únicamente lo que cambió, no todo el conjunto de datos.
Cuando se ejecutan operaciones INSERT, UPDATE o DELETE en una tabla base, el sistema registra automáticamente estos cambios. Este proceso se ejecuta de manera eficiente en un nodo de almacenamiento columnar In-Memory Columnar Index (IMCI). No requiere binlogs ni triggers, y no bloquea la tabla base.
FAST (actualización incremental): procesa solo los datos que cambiaron desde la última actualización, lo que garantiza alta velocidad y bajo consumo de recursos.
COMPLETE (actualización completa): vuelve a calcular toda la consulta. Es adecuada para la carga inicial de datos o para corregirlos.
Requisitos previos
Para usar una vista materializada incremental, su sistema debe cumplir con los siguientes requisitos:
-
Clúster: su clúster de PolarDB for MySQL debe cumplir con uno de los siguientes requisitos:
MySQL 8.0.2 con la versión secundaria del kernel 8.0.2.2.35 o posterior.
-
Parámetros de In-Memory Columnar Index (IMCI):
Parámetro
Predeterminado
Valor
Descripción
imci_enable_window_function
2
>= 2
Habilita la compatibilidad con las funciones de ventana de IMCI.
imci_enable_nci_async_pre_commit
OFF
OFF
Deshabilita el pre-commit asíncrono de NCI para garantizar la consistencia de los datos incrementales.
NotaEste parámetro tiene el valor OFF de forma predeterminada y no se puede modificar por ahora.
imci_enable_hybrid_plan
ON
OFF
Deshabilita el plan de ejecución híbrido para forzar que las actualizaciones incrementales se ejecuten en el nodo de almacenamiento columnar de solo lectura.
NotaEstos parámetros se modify en la consola de PolarDB.
Ventajas principales
|
Ventaja |
Descripción |
|
Sincronización de datos de baja latencia |
Mantiene los datos de la vista sincronizados con la tabla base con una latencia mínima. Reduce los tiempos de actualización de minutos a segundos o incluso milisegundos, ya que evita los escaneos completos de la tabla base al procesar solo los cambios incrementales. |
|
Menor carga del sistema |
Reduce de forma significativa el consumo de CPU, memoria y E/S. Esta ventaja destaca especialmente en escenarios con tablas base grandes y un volumen pequeño de cambios. |
|
Uso transparente de IMCI |
Los cálculos incrementales se ejecutan en el nodo de almacenamiento columnar de IMCI, lo que aprovecha por completo las capacidades de agregación de alta velocidad del almacenamiento columnar. |
|
Consultas analíticas más rápidas |
Ofrece tiempos de respuesta de nivel de milisegundos para consultas complejas de agregación y unión en escenarios HTAP (procesamiento transaccional y analítico híbrido). |
|
Mantenimiento automatizado en segundo plano |
El sistema gestiona automáticamente el ciclo de vida del registro incremental (tabla delta). |
Casos de uso
Precálculo para análisis: preprocesa uniones complejas de varias tablas en una tabla ancha para evitar operaciones de unión costosas en cada consulta.
Aceleración de reportes: proporciona datos precalculados para almacenes de datos en tiempo real o reportes de BI. Las actualizaciones incrementales reducen la sobrecarga de actualización en más de un 90 %.
Reutilización de cálculos: reutilice los resultados de los cálculos mediante la creación de vistas materializadas anidadas.
Almacén de datos en tiempo real: admite consultas analíticas que reflejan los cambios de la tabla base casi en tiempo real.
Cargas de trabajo HTAP: sincroniza los datos OLTP que se actualizan con frecuencia hacia una vista analítica con baja latencia, lo que separa las cargas de trabajo TP y AP.
Limitaciones
-
Limitaciones generales:
Sintaxis no compatible: la actualización incremental no es compatible con consultas que contienen una subconsulta,
UNION,ORDER BY,LIMIT, funciones de ventana,HAVING,ROLLUPoCTE.UNION ALL: no compatible actualmente.-
Requisitos de la tabla base:
La tabla base debe tener IMCI habilitado (
polar_enable_imci = ON) y todas sus columnas deben incluirse en el IMCI.La tabla base no puede ser una vista estándar ni una vista materializada no incremental. Se permiten las vistas materializadas anidadas, siempre que la vista interna también admita la actualización incremental.
-
Consumo de almacenamiento:
Una vista materializada almacena una copia de los datos, lo que consume espacio de almacenamiento adicional.
El sistema también consume almacenamiento adicional para registrar los cambios destinados a las actualizaciones incrementales. Este consumo no crece de forma indefinida, ya que los datos obsoletos se recuperan periódicamente.
-
Limitaciones para el filtrado de una sola tabla:
La tabla base debe tener una clave primaria explícita.
No se admite la palabra clave
DISTINCT.
-
Limitaciones para la agregación de una sola tabla:
La tabla base debe tener una clave primaria explícita.
La cláusula
GROUP BYdebe hacer referencia a columnas individuales y no puede usar expresiones. Por ejemplo, no se admiteGROUP BY YEAR(create_time); debe cambiarla aGROUP BY create_year.Funciones de agregación compatibles:
COUNT,SUMyAVG.Funciones de agregación no compatibles:
STDDEV,VARIANCE,MINyMAX.Actualmente no se admite la agregación sin una cláusula
GROUP BY.Actualmente no se admite la agregación de varias tablas.
-
Limitaciones para las uniones de varias tablas
Todas las tablas base deben tener una clave primaria explícita.
No se admite
RIGHT JOIN.Las uniones deben seguir una estructura de árbol profundo por la izquierda. No se permiten estructuras anidadas como
A JOIN (B LEFT JOIN C) JOIN D.La condición ON de cada tabla debe incluir una columna de otra tabla. No se permite la sintaxis como
A JOIN B ON B.id = 1.
Sintaxis
CREATE MATERIALIZED VIEW mv_name
[REFRESH [COMPLETE | FAST] [ON DEMAND]]
[START WITH now()] [NEXT now() + interval 5 second]
AS SELECT ... FROM base_table;
FAST: especifica el modo de actualización incremental, que procesa solo los cambios de la tabla base.COMPLETE: especifica el modo de actualización completa, que vuelve a calcular toda la consulta cada vez.ON DEMAND: especifica una actualización bajo demanda, que se debe activar manualmente o mediante un intervalo de actualización en segundo plano predefinido.
Ejemplos
Ejemplo 1: filtro de una sola tabla (tipo FILTER)
-
Cree una tabla base con el índice columnar habilitado.
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, c3 INT) COMMENT 'COLUMNAR=1'; INSERT INTO t1 VALUES (1, 1, 1); -
Cree una vista materializada incremental.
CREATE MATERIALIZED VIEW mv_filter REFRESH FAST ON DEMAND AS SELECT * FROM t1 WHERE c2 < 5;Ejecute una actualización completa para cargar los datos iniciales.
REFRESH MATERIALIZED VIEW mv_filter; -
Ejecute una actualización incremental después de que cambien los datos de la tabla base.
-- Change the base table INSERT INTO t1 VALUES (2, 2, 3); DELETE FROM t1 WHERE c1 = 1; -- Perform an incremental refresh to process only the changes above REFRESH MATERIALIZED VIEW mv_filter;
Ejemplo 2: estadísticas de agregación (tipo AGGREGATE)
-- Create a base table with the columnar index enabled
CREATE TABLE orders (
order_id INT PRIMARY KEY, -- Unique order ID (primary key)
user_id INT NOT NULL, -- User ID (GROUP BY column)
amount DECIMAL(12, 2) NOT NULL, -- Order amount (aggregation column)
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Order time (standard business field)
)COMMENT 'COLUMNAR=1';
-- Aggregate statistics
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;
Funciones de agregación compatibles: COUNT(*), COUNT(expr), SUM(expr) y AVG(expr).
Ejemplo 3: INNER JOIN de varias tablas
-
Cree las tablas base.
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');Cree una vista materializada incremental para un INNER JOIN de varias tablas.
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; -
Ejecute una actualización completa y compruebe el resultado.
-- Perform a full refresh to populate the initial data REFRESH MATERIALIZED VIEW mv_inner_with_where_on; -- Change the base tables 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'); -- Perform an incremental refresh REFRESH MATERIALIZED VIEW mv_inner_with_where_on;
Ejemplo 4: LEFT JOIN
-- Create base tables with the columnar index enabled
-- Create the products table (joined table / right table)
CREATE TABLE products (
product_id INT PRIMARY KEY, -- Join key, must be the primary key
product_name VARCHAR(100) NOT NULL, -- Product name
price DECIMAL(10, 2) -- Other business fields
) COMMENT 'COLUMNAR=1';
-- Create the order items table (primary table / left table)
CREATE TABLE order_items (
item_id INT PRIMARY KEY, -- Item ID, must be the primary key
order_id INT NOT NULL, -- Order ID
product_id INT, -- Join key, can be NULL (because this is a LEFT JOIN)
quantity INT NOT NULL, -- Purchase quantity
FOREIGN KEY (product_id) REFERENCES products(product_id) -- Optional foreign key constraint
) 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;
Ejemplo 5: vista materializada anidada (reutilización de cálculos)
Una vista materializada anidada se construye sobre otra vista materializada incremental, lo que le permite reutilizar los resultados de los cálculos. Por ejemplo, primero puede filtrar los datos válidos de una tabla base y luego aplicar una agregación sobre el resultado filtrado. Durante una actualización, cada capa procesa únicamente sus respectivos cambios incrementales.
-
Cree una tabla base.
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); -
Cree la vista materializada incremental de primer nivel para filtrar los pedidos pagados.
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';Ejecute una actualización completa para cargar los datos iniciales.
REFRESH MATERIALIZED VIEW mv_paid_orders; -
Cree la vista materializada incremental de segundo nivel para agregar estadísticas por categoría, con base en la vista de primer nivel.
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;Ejecute una actualización completa para cargar los datos iniciales.
REFRESH MATERIALIZED VIEW mv_category_revenue; -
Después de que cambien los datos de la tabla base, ejecute una actualización incremental para cada nivel en orden.
-- Add new data to the base table INSERT INTO order_log VALUES (6, 105, 'electronics', 199.00, 'paid', 2025), (7, 106, 'clothing', 75.00, 'cancelled', 2025); -- Refresh in dependency order: first level, then second level REFRESH MATERIALIZED VIEW mv_paid_orders; REFRESH MATERIALIZED VIEW mv_category_revenue; -- Verify the result: order_id=7 is filtered out by the first level because its status is 'cancelled' -- and will not be included in the second-level statistics. SELECT * FROM mv_category_revenue;
Para garantizar la consistencia de los datos, debe actualizar las vistas materializadas anidadas según su orden de dependencia, desde la vista base hasta la vista de nivel superior. La vista materializada subyacente debe ser de tipo de actualización incremental (REFRESH FAST).
Ejecutar una actualización incremental
Para activar una actualización manualmente, ejecute el siguiente comando:
REFRESH MATERIALIZED VIEW mv_name;
Una actualización incremental procesa solo los cambios ocurridos en la tabla base desde la última actualización. Esto la hace rápida y de bajo consumo, sin necesidad de escanear toda la tabla.
Cuando ejecuta REFRESH MATERIALIZED VIEW por primera vez, el sistema ejecuta automáticamente una actualización completa para cargar los datos iniciales. Las actualizaciones posteriores son incrementales.
Eliminar una vista materializada
DROP MATERIALIZED VIEW mv_name;
Después de eliminar una vista materializada, el sistema limpia automáticamente la tabla delta correspondiente si el parámetro delta_mv_auto_cleanup = ON está habilitado (valor predeterminado).
Gestión y monitoreo
Lista de vistas materializadas
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';
Todas las vistas materializadas
SELECT * FROM mysql.view_materialized_info;
Cola de tareas de actualización
SELECT * FROM information_schema.materialized_view_refresh_queue;
Preguntas frecuentes
¿Cómo comprobar la actualización incremental?
Use la siguiente instrucción para comprobar que refresh_strategy sea FAST. También puede consultar la columna last_refresh_status para ver el resultado de la actualización más reciente.
SELECT table_name, refresh_strategy, last_start_time, last_end_time
FROM mysql.view_materialized_info;
¿Cuándo se actualiza la vista materializada?
Antes de una actualización, los datos de la vista reflejan su estado en el momento de la última actualización. Para actualizar los datos, debe ejecutar manualmente REFRESH MATERIALIZED VIEW mv_name.
¿Se bloquea la tabla base durante la actualización?
No. Puede continuar con las operaciones normales de lectura y escritura en la tabla base durante una actualización incremental sin ninguna afectación.
¿Se admite la agregación en la actualización incremental?
Actualmente se admite la actualización incremental para la agregación de una sola tabla. La agregación de varias tablas y UNION ALL no son compatibles por ahora.
¿Cuál es el intervalo mínimo de actualización?
El intervalo mínimo de actualización es de 1 segundo actualmente.