sql >> Base de Datos >  >> RDS >> MariaDB

¿Qué son las tablas temporales de MariaDB?

A partir de 10.3.4, MariaDB viene con tablas temporales. Todavía es una característica bastante poco común y nos gustaría discutir un poco qué son esas tablas y para qué pueden ser útiles.

En primer lugar, en caso de que alguien haya leído mal el título de este blog, aquí estamos hablando de tablas temporales, no tablas temporales, que también existen en MariaDB. Sin embargo, tienen algo en común. Tiempo. Las tablas temporales son de corta duración, las tablas temporales, por otro lado, están diseñadas para dar acceso a los datos a lo largo del tiempo. En resumen, puede ver las tablas temporales como una tabla versionada que se puede usar para acceder y modificar datos anteriores, encontrar qué cambios se han realizado y cuándo. También se puede usar para retroceder datos a un punto particular en el tiempo.

Cómo usar tablas temporales en MariaDB

Para crear una tabla temporal solo debemos agregar “CON VERSIONAMIENTO DEL SISTEMA” al comando CREAR TABLA. Si desea convertir una tabla normal en una temporal, puede ejecutar:

ALTER TABLE mytable ADD SYSTEM VERSIONING;

Esto es prácticamente todo. Se creará una tabla temporal y podrá comenzar a consultar sus datos. Hay un par de formas de hacerlo.

Primero, podemos usar SELECT para consultar datos a partir de un momento particular:

SELECT * FROM mytable FOR SYSTEM_TIME AS OF TIMESTAMP ‘2020-06-26 10:00:00’;

También puede hacer una consulta para un rango:

SELECT * FROM mytable FOR SYSTEM_TIME FROM ‘2020-06-26 08:00:00’ TO ‘2020-06-26 10:00:00’;

También es posible mostrar todos los datos:

SELECT * FROM mytable FOR SYSTEM_TIME ALL;

Si es necesario, puede crear vistas a partir de tablas temporales, siguiendo el mismo patrón que hemos mostrado anteriormente.

Dado que es posible que las mismas filas no se actualicen en todos los nodos al mismo tiempo (por ejemplo, demoras causadas por la replicación), si desea ver exactamente el mismo estado de los datos en todo el múltiples esclavos, puede definir el punto de tiempo usando la identificación de transacción de InnoDB:

SELECT * FROM mytable FOR SYSTEM_TIME AS OF TRANSACTION 123;

De forma predeterminada, todos los datos se almacenan en la misma tabla, tanto las versiones actuales como las antiguas de las filas. Esto puede agregar algo de sobrecarga cuando consulta solo los datos recientes. Es posible usar particiones para reducir esta sobrecarga creando una o más particiones para almacenar datos históricos y una para almacenar versiones recientes de las filas. Luego, mediante la eliminación de particiones, MariaDB podrá reducir la cantidad de datos que tiene que consultar para obtener el resultado de la consulta:

CREATE TABLE mytable (a INT) WITH SYSTEM VERSIONING

  PARTITION BY SYSTEM_TIME INTERVAL 1 WEEK (

    PARTITION p0 HISTORY,

    PARTITION p1 HISTORY,

    PARTITION p2 HISTORY,

    PARTITION pcur CURRENT

  );

También puede usar otros medios para particionarlo como, por ejemplo, definir el número de filas para almacenar por partición.

Al usar el particionamiento, ahora podemos aplicar las mejores prácticas regulares de particionamiento, como la rotación de datos, eliminando las particiones antiguas. Si no creó particiones, aún puede hacerlo a través de comandos como:

DELETE HISTORY FROM mytable;

DELETE HISTORY FROM mytable BEFORE SYSTEM_TIME '2020-06-01 00:00:00';

Si es necesario, puede excluir algunas de las columnas del control de versiones:

CREATE TABLE mytable (

   a INT,

   b INT WITHOUT SYSTEM VERSIONING

) WITH SYSTEM VERSIONING;

En MariaDB 10.4 se ha agregado una nueva opción, períodos de tiempo de aplicación. Lo que significa es, básicamente, que en lugar de la hora del sistema, es posible crear versiones basadas en dos columnas (basadas en el tiempo) en la tabla:

CREATE TABLE mytable (

   a INT, 

   date1 DATE,

   date2 DATE,

   PERIOD FOR date_period(date1, date2));

También es posible actualizar o eliminar filas según el tiempo (ACTUALIZAR POR PORCIÓN y ELIMINAR POR PORCIÓN). También es posible combinar versiones en tiempo de aplicación y tiempo de sistema en una tabla.

Ejemplos de tablas temporales en MariaDB

Bien, hemos discutido las posibilidades, echemos un vistazo a algunas de las cosas que podemos hacer con las tablas temporales.

Al principio, creemos una tabla y llenémosla con algunos datos:

MariaDB [(none)]> CREATE DATABASE versioned;

Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> use versioned

Database changed

MariaDB [versioned]> CREATE TABLE mytable (a INT, b INT) WITH SYSTEM VERSIONING;

Query OK, 0 rows affected (0.005 sec)



MariaDB [versioned]> INSERT INTO mytable VALUES (1,1);

Query OK, 1 row affected (0.001 sec)

MariaDB [versioned]> INSERT INTO mytable VALUES (2,1);

Query OK, 1 row affected (0.001 sec)

MariaDB [versioned]> INSERT INTO mytable VALUES (3,1);

Query OK, 1 row affected (0.000 sec)

Ahora, actualicemos un par de filas:

MariaDB [versioned]> UPDATE mytable SET b = 2 WHERE a < 3;

Query OK, 2 rows affected (0.001 sec)

Rows matched: 2  Changed: 2  Inserted: 2  Warnings: 0

Ahora, veamos todas las filas que están almacenadas en la tabla:

MariaDB [versioned]> SELECT * FROM mytable FOR SYSTEM_TIME ALL ;

+------+------+

| a    | b    |

+------+------+

|    1 |    2 |

|    2 |    2 |

|    3 |    1 |

|    1 |    1 |

|    2 |    1 |

+------+------+

5 rows in set (0.000 sec)

Como puede ver, la tabla contiene no solo las versiones actuales de las filas sino también los valores originales, antes de que los actualizáramos.

Ahora, veamos qué hora es y luego agreguemos algunas filas más. Veremos si podemos ver las versiones actuales y anteriores.

MariaDB [versioned]> SELECT NOW();

+---------------------+

| NOW()               |

+---------------------+

| 2020-06-26 11:24:55 |

+---------------------+

1 row in set (0.000 sec)

MariaDB [versioned]> INSERT INTO mytable VALUES (4,1);

Query OK, 1 row affected (0.001 sec)

MariaDB [versioned]> INSERT INTO mytable VALUES (5,1);

Query OK, 1 row affected (0.000 sec)

MariaDB [versioned]> UPDATE mytable SET b = 3 WHERE a < 2;

Query OK, 1 row affected (0.001 sec)

Rows matched: 1  Changed: 1  Inserted: 1  Warnings: 0;

Ahora, revisemos el contenido de la tabla. Solo versiones actuales de las filas:

MariaDB [versioned]> SELECT * FROM mytable;

+------+------+

| a    | b    |

+------+------+

|    1 |    3 |

|    2 |    2 |

|    3 |    1 |

|    4 |    1 |

|    5 |    1 |

+------+------+

5 rows in set (0.000 sec)

Luego, accedamos al estado de la tabla antes de realizar las inserciones y actualizaciones:

MariaDB [versioned]> SELECT * FROM mytable FOR SYSTEM_TIME AS OF TIMESTAMP '2020-06-26 11:24:55';

+------+------+

| a    | b    |

+------+------+

|    2 |    2 |

|    3 |    1 |

|    1 |    2 |

+------+------+

3 rows in set (0.000 sec)

Funciona como se esperaba, solo vemos tres filas en la tabla.

Este breve ejemplo no es extenso. Queríamos darle una idea de cómo puede operar las tablas temporales. Las aplicaciones de esto son numerosas. Mejor seguimiento del estado del pedido en el comercio electrónico, control de versiones de los contenidos (archivos de configuración, documentos), información sobre los datos anteriores con fines analíticos.

Para que quede claro, esta función se puede implementar usando tablas "tradicionales", siempre que siga insertando filas, sin actualizarlas, pero la administración es mucho más fácil de hacer cuando se usan tablas temporales.