Una vista materializada es un objeto de base de datos que optimiza las consultas complejas. Para lograrlo, calcula y almacena los resultados previamente. Al guardar estos datos, usted consulta directamente la información precalculada. Esto evita volver a ejecutar operaciones que consumen muchos recursos y acelera las consultas, ya que intercambia espacio de almacenamiento por tiempo de ejecución.
Las vistas materializadas en los clústeres de PolarDB for MySQL admiten la actualización completa. Se pueden usar métodos de actualización programados o manuales. Estas vistas utilizan un mecanismo de tareas en segundo plano para actualizarse. Usted puede combinarlas con un IMCI para acelerar las consultas, lo cual mejora la eficiencia de las tareas de actualización y reduce la carga en los nodos de solo lectura. Esta función se basa en la arquitectura HTAP de PolarDB y amplía aún más las capacidades de procesamiento analítico (AP).
Una vista materializada se diferencia de una vista normal porque contiene una copia física de los datos que usted consulta directamente. Está formada por la vista misma y su tabla base física subyacente.
Create a materialized view: crear la vista y materializar los datos son dos pasos independientes. La materialización es una operación asíncrona que se envía a una tarea en segundo plano para llenar la tabla base física. El nombre de esta tabla se asocia con la vista. Las tareas de materialización y actualización incluyen operaciones de consulta e inserción. La operación de consulta se descarga a un nodo de solo lectura con un IMCI para acelerar las consultas y reducir el impacto en el nodo principal.
Query a materialized view: las consultas sobre una vista materializada se ejecutan contra su tabla base física subyacente.
Refresh a materialized view: el proceso de actualización completa crea una nueva tabla base física oculta. Después de ejecutar la instrucción de actualización en la tabla oculta, el sistema intercambia la tabla base original con la oculta. Esta acción actualiza la tabla de metadatos con la información de la tabla base física más reciente y la sincroniza con la estructura en memoria para las consultas.
Task monitoring and management: consulte la cola de tareas de actualización en segundo plano para ver los detalles de cada tarea. También puede monitorear y gestionar las tareas; por ejemplo, pause o reinicie las actualizaciones programadas de una vista materializada a nivel de tabla, de base de datos o global.
Requisitos
Su clúster de PolarDB for MySQL debe cumplir uno de los siguientes requisitos:
MySQL 8.0.1, con una versión secundaria del motor 8.0.1.1.51 o posterior.
MySQL 8.0.2, con una versión secundaria del motor 8.0.2.2.31 o posterior.
Beneficios
Evita cálculos repetidos: en consultas complejas que consumen muchos recursos, los resultados se calculan una sola vez y se reutilizan varias veces. Esto mejora significativamente la eficiencia de las consultas.
Preagregación de datos: preagregue los datos para informes diarios, semanales y mensuales. Así acelera la generación de informes y el análisis de datos.
Consultas optimizadas en conjuntos de datos grandes: reduce los escaneos directos sobre grandes volúmenes de datos sin procesar y acelera los tiempos de respuesta en consultas analíticas.
Compatibilidad con análisis multidimensional: precalcule datos agregados para distintas combinaciones de dimensiones. De este modo, obtiene soporte eficiente para OLAP y otros escenarios de análisis multidimensional.
Escenarios de uso
Las vistas materializadas optimizan el rendimiento de las consultas al calcular y almacenar previamente los resultados. Son especialmente útiles para procesar datos a gran escala y consultas complejas. Reducen la sobrecarga de los cálculos en tiempo real y simplifican la lógica de las consultas, por lo que resultan ideales para generar informes rápidamente y analizar datos.
Evitar cálculos repetidos: recomendado cuando necesita almacenar los resultados de cálculos frecuentes que consumen muchos recursos. Al usar vistas materializadas, no tiene que recalcular los mismos datos, lo cual mejora notablemente la eficiencia de las consultas.
Preagregación de datos: en la generación de informes y el análisis de datos, estas vistas preagregan información como ventas diarias, semanales o mensuales, además de datos de comportamiento de usuarios. Almacenar previamente los resultados reduce el tiempo y los recursos necesarios para el cálculo en tiempo real.
Consultas optimizadas en conjuntos de datos grandes: consultar directamente grandes volúmenes de datos sin procesar consume mucho tiempo debido a los escaneos frecuentes y masivos. Las vistas materializadas reducen la necesidad de acceder a los datos originales, lo que acelera las consultas y el análisis.
Compatibilidad con análisis multidimensional: estas vistas precalculan datos agregados para distintas combinaciones de dimensiones. Gracias a ello, ofrecen respuestas rápidas y eficientes en escenarios de análisis de datos multidimensionales.
Parámetros
Los parámetros de un clúster de PolarDB difieren entre la consola y una sesión de base de datos. A continuación se describen las diferencias:
-
En la consola de PolarDB:
Compatibilidad: para ser compatibles con los archivos de configuración de MySQL, algunos parámetros del clúster en la consola de PolarDB tienen el prefijo loose_.
Procedimiento: busque y modifique los parámetros que tienen el prefijo
loose_.
-
En una sesión de base de datos (mediante la línea de comandos o un cliente)
Procedimiento: cuando use el comando
SETpara modificar un parámetro en una sesión de base de datos, quite el prefijoloose_y utilice el nombre original del parámetro.
|
Parámetro |
Descripción |
|
loose_materialized_view_enabled |
Especifica si se habilitan las vistas materializadas. Valores válidos:
|
|
loose_enable_materialized_view_parallel |
Especifica si se habilita la función de consulta paralela para las vistas materializadas. Valores válidos:
|
Crear una vista materializada
Sintaxis
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
Permisos
El permiso
CREATEsobre la base de datos donde se encuentra la vista materializada.El permiso
SELECTsobre las columnas correspondientes (o sobre toda la tabla) de todas las tablas base de la vista materializada.
Parámetros
|
Parámetro |
Obligatorio |
Descripción |
|
view_name |
Sí |
El nombre de la vista materializada. |
|
column_list |
No |
Las columnas que se incluirán en la vista materializada. Para asignar nombres específicos a las columnas de la vista, enumérelas en |
|
REFRESH |
No |
Especifica la política de actualización de la vista materializada.
Nota
Este tema describe la política de actualización completa. Para obtener información sobre la política de actualización incremental, consulte Incrementally refresh a materialized view. |
|
ON |
No |
Especifica el tipo de materialización de la vista materializada.
Nota
Actualmente, solo se admite el tipo de vista materializada asíncrona. |
|
START WITH |
No |
La hora de inicio para la actualización automática de una vista materializada asíncrona. |
|
NEXT |
No |
El intervalo de actualización de una vista materializada asíncrona. Nota
Si no especifica NEXT, la vista solo se actualizará de forma manual. |
|
QUERY REWRITE |
No |
Especifica si la vista materializada admite la reescritura de consultas.
Nota
Actualmente, la reescritura de consultas no es compatible. |
|
MATERIALIZED OPTIONS |
No |
Especifica los parámetros extendidos de la vista materializada. El valor es una cadena, normalmente un objeto JSON. Para más detalles, consulte mv_options usage. |
|
select_statement |
Sí |
La instrucción de consulta que define los datos de la vista materializada. Esta instrucción recupera datos de las tablas base y almacena el resultado en la vista materializada. |
Uso de mv_options
mv_options se especifica mediante la cláusula MATERIALIZED OPTIONS = 'json_options'. Dicha cláusula debe aparecer antes de AS select_statement, y json_options debe ser un objeto JSON válido.
-
Versiones compatibles:
MySQL 8.0.1, versión secundaria del kernel
8.0.1.1.55o posterior.MySQL 8.0.2, versión secundaria del kernel
8.0.2.2.35o posterior.
-
mv_optionsadmite los siguientes campos:Campo
Tipo
Valor
Descripción
order_keySTRING
Un nombre de columna o un texto de expresión.
Establece el valor
order_keyde la tabla contenedora de la vista materializada.engineSTRING
-
InnoDB -
XEngine
Especifica el motor de almacenamiento que usa la tabla contenedora de la vista materializada. El valor no distingue entre mayúsculas y minúsculas.
table_formatSTRING
-
row -
column
Especifica el formato de almacenamiento por filas o por columnas de la tabla contenedora. El valor no distingue entre mayúsculas y minúsculas.
-
El motor
InnoDBsolo admiterow. -
El motor
XEngineadmite tantorowcomocolumn, y suele usarse junto conengine: "xengine".
refresh_policySTRING
-
MASTER -
PREFER_TPRO -
PREFER_IMCI -
FORCE_TPRO -
FORCE_IMCI -
COST
Especifica la política de descarga para la tarea de actualización completa. El valor no distingue entre mayúsculas y minúsculas. Una cadena vacía o un valor desconocido hace que el sistema aplique la política predeterminada definida por la variable del sistema.
-
MASTER: actualiza en el nodo principal. -
PREFER_TPRO: prefiere actualizar en un nodo de solo lectura (RO) con almacenamiento por filas. Si no existe ningún nodo RO con almacenamiento por filas, actualiza en el nodo principal. -
PREFER_IMCI: prefiere actualizar en un nodo RO con índice de almacenamiento por columnas. Si no existe ningún nodo RO con índice de almacenamiento por columnas, actualiza en el nodo principal. -
FORCE_TPRO: fuerza la actualización en un nodo RO con almacenamiento por filas. Devuelve un error si no existe ningún nodo RO con almacenamiento por filas. -
FORCE_IMCI: fuerza la actualización en un nodo RO con índice de almacenamiento por columnas. Devuelve un error si no existe ningún nodo RO con índice de almacenamiento por columnas. -
COST: elige entre un nodo RO con almacenamiento por filas y un nodo RO con índice de almacenamiento por columnas según el costo de la consulta para ejecutar la actualización.
unique_checkINT
-
1 -
0
Se usa para las tablas contenedoras con almacenamiento por columnas de XEngine.
-
0relaja la comprobación de unicidad durante la actualización. -
1u omitir el campo mantiene la comprobación predeterminada.
NotaPor ahora,
engine,table_format,refresh_policyyunique_checksolo son compatibles con MySQL 8.0.2. -
-
Notas:
MATERIALIZED OPTIONS = ''se interpreta como si no se hubieran establecido parámetros extendidos.Cuando
SHOW CREATE TABLEmuestra la definición de la vista materializada, incluye la cláusulaMATERIALIZED OPTIONSconfigurada.La capa de sintaxis solo acepta una cadena. Si el análisis posterior falla, se registra un
WARNINGy el procesamiento continúa con el comportamiento predeterminado, como si no se hubiera analizado ningún parámetro correspondiente.
-
Ejemplo:
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;
Ejemplo
-
Cree las tablas
table1ytable2para usarlas como tablas base de la vista materializada.-- Create the base tables. CREATE TABLE table1 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT); CREATE TABLE table2 (col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT); -- Insert data into the base tables. 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); -
Cree una vista materializada.
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; -
Cree una vista materializada con
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;
Consultar una vista materializada
Para consultar una vista materializada, necesita el permiso SELECT sobre la vista. No requiere el permiso SELECT sobre las tablas base subyacentes de la vista.
Consultar una vista materializada
SELECT * FROM mv1;
El resultado esperado es:
+-----------+-----------+
| sum_value | avg_value |
+-----------+-----------+
| 600 | 200.0000 |
+-----------+-----------+
Consultar la definición de la vista
SHOW CREATE VIEW mv1;
El resultado esperado es:
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| 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 |
+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
Consultar desde una tabla del sistema
SELECT * FROM mysql.view_materialized_info;
Descripción de los campos
|
Campo |
Descripción |
|
TABLE_SCHEMA |
El nombre de la base de datos donde se encuentra la vista materializada. |
|
TABLE_NAME |
El nombre de la vista materializada. |
|
IS_DROPPED |
Indica si la vista se eliminó.
|
|
FIRST_REFRESH_TIME |
Si se configuró la actualización automática, esta es la hora de la primera actualización. |
|
TIME_ZONE |
La configuración de zona horaria. |
|
REFRESH_CONDITION |
El mecanismo que activa la actualización.
|
|
REFRESH_STRATEGY |
La política de actualización de la vista materializada.
|
|
REFRESH_START_TIME |
La hora de inicio configurada para la primera actualización. |
|
NEXT_TIME_EXPRESSION |
La definición de la próxima hora de actualización de una vista materializada asíncrona. |
|
LAST_START_TIME |
La hora en la que realmente comenzó la última actualización. |
|
LAST_END_TIME |
La hora en la que realmente terminó la última actualización. |
|
CONTAINER_TABLE_POSTFIX |
El sufijo de la tabla física utilizada para el almacenamiento de datos. |
|
EXPIRED_TABLE_POSTFIX |
El sufijo de la tabla física que contiene los datos caducados después de una actualización. |
|
IS_STOPPED |
Indica si la actualización programada está detenida.
|
|
CREATE_TIME |
La hora en la que se crearon los metadatos de la vista materializada. |
|
UPDATE_TIME |
La hora de la última actualización de los metadatos de la vista materializada. |
El resultado esperado es:
+-----+--------------+------------+------------+---------------------+-----------+-------------------+------------------+---------------------+---------------------------+---------------------+---------------------+-------------------------+-----------------------+------------+---------------------+---------------------+
| 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 |
+-----+--------------+------------+------------+---------------------+-----------+-------------------+------------------+---------------------+---------------------------+---------------------+---------------------+-------------------------+-----------------------+------------+---------------------+---------------------+
Actualizar una vista materializada
Actualmente, las vistas materializadas solo admiten la actualización completa. Este proceso utiliza un método fuera de lugar (out-of-place): crea una tabla base física oculta, ejecuta la instrucción de actualización en ella y luego intercambia la tabla base original con la oculta. Por lo tanto, una actualización completa requiere espacio de almacenamiento adicional. Su principal ventaja es que admite cualquier consulta SQL.
Las vistas materializadas admiten dos métodos de actualización: manual y programada.
Actualización manual
Si una vista materializada no está configurada para actualizaciones programadas, o si el intervalo de actualización es muy largo, use el comando REFRESH MATERIALIZED VIEW para actualizar los datos manualmente.
REFRESH MATERIALIZED VIEW <view_name>;
Ejemplo
-
Inserte nuevos datos de prueba.
INSERT INTO table1 VALUES (5, 'E', 500), (6, 'F', 600); INSERT INTO table2 VALUES (7, 'U', 60), (8, 'V', 70); -
Actualice manualmente la vista materializada.
REFRESH MATERIALIZED VIEW mv1; -
Consulte la vista materializada.
SELECT * FROM mv1;El resultado esperado es:
+-----------+-----------+ | sum_value | avg_value | +-----------+-----------+ | 1100 | 275.0000 | +-----------+-----------+
Actualización programada
Al crear una vista materializada, especifique una hora de inicio para las actualizaciones programadas mediante START WITH y configure un intervalo de actualización automática con NEXT. El sistema programa automáticamente la tarea de actualización según la configuración indicada.
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;
Eliminar una vista materializada
Para eliminar una vista materializada, necesita el permiso DROP sobre la base de datos donde se encuentra dicha vista.
Sintaxis
DROP MATERIALIZED VIEW <view_name>;
Ejemplo
DROP MATERIALIZED VIEW mv1;
Monitorear y gestionar tareas
La actualización programada de una vista materializada depende del mecanismo de programación automática del sistema. Es posible que necesite monitorear y gestionar una gran cantidad de tareas programadas. Usted puede pausar o reiniciar las tareas de actualización programadas de una vista materializada a nivel de tabla, de base de datos o global.
Consultar la cola de tareas
Consulte la vista del sistema information_schema.materialized_view_refresh_queue para ver la cola de actualizaciones.
SELECT * FROM information_schema.materialized_view_refresh_queue;
Pausar la cola de tareas
Por tabla
STOP MATERIALIZED VIEW task FOR TABLE mv1;
Por base de datos
STOP MATERIALIZED VIEW task FOR DATABASE mv1;
De forma global
STOP MATERIALIZED VIEW task FOR ALL;
Reiniciar la cola de tareas
Por tabla
RESTART MATERIALIZED VIEW task FOR TABLE mv1;
Por base de datos
RESTART MATERIALIZED VIEW task FOR DATABASE mv1;
De forma global
RESTART MATERIALIZED VIEW task FOR ALL;
Comprobar el estado de pausa o reinicio
Después de ejecutar el comando STOP o RESTART, consulte la columna IS_STOPPED de la tabla mysql.view_materialized_info para confirmar si la operación surtió efecto:
SELECT TABLE_SCHEMA, TABLE_NAME, IS_STOPPED FROM mysql.view_materialized_info;
IS_STOPPED=1: La tarea de actualización programada está en pausa.IS_STOPPED=0: La tarea de actualización programada se está ejecutando.
La columna IS_STOPPED no está disponible en la vista del sistema information_schema.materialized_view_refresh_queue. Utilice mysql.view_materialized_info en su lugar.