MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Que sont les tables temporelles MariaDB ?

À partir de 10.3.4, MariaDB est livré avec des tables temporelles. C'est encore une fonctionnalité assez rare et nous aimerions discuter un peu de ce que sont ces tableaux et de ce à quoi ils peuvent être utiles.

Tout d'abord, au cas où quelqu'un aurait mal lu le titre de ce blog, nous parlons ici de tables temporelles, pas de tables temporaires, qui existent aussi dans MariaDB. Ils ont cependant quelque chose en commun. Temps. Les tables temporaires sont de courte durée, les tables temporelles quant à elles sont conçues pour donner accès aux données dans le temps. En bref, vous pouvez voir les tables temporelles comme une table versionnée qui peut être utilisée pour accéder et modifier les données passées, trouver quelles modifications ont été apportées et quand. Il peut également être utilisé pour restaurer des données à un moment donné.

Comment utiliser les tables temporelles dans MariaDB

Pour créer une table temporelle, il suffit d'ajouter "WITH SYSTEM VERSIONING" à la commande CREATE TABLE. Si vous souhaitez convertir une table normale en une table temporelle, vous pouvez exécuter :

ALTER TABLE mytable ADD SYSTEM VERSIONING;

C'est à peu près tout. Une table temporelle sera créée et vous pourrez commencer à interroger ses données. Il existe plusieurs façons de procéder.

Tout d'abord, nous pouvons utiliser SELECT pour interroger les données à un moment précis :

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

Vous pouvez également effectuer une requête sur une plage :

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

Il est également possible d'afficher toutes les données :

SELECT * FROM mytable FOR SYSTEM_TIME ALL;

Si nécessaire, vous pouvez créer des vues à partir de tables temporelles, en suivant le même modèle que celui que nous avons montré ci-dessus.

Étant donné que les mêmes lignes peuvent ne pas être mises à jour sur tous les nœuds en même temps (par exemple, les retards causés par la réplication), si vous voulez voir exactement le même état des données sur l'ensemble du plusieurs esclaves, vous pouvez définir le moment à l'aide de l'identifiant de transaction InnoDB :

SELECT * FROM mytable FOR SYSTEM_TIME AS OF TRANSACTION 123;

Par défaut, toutes les données sont stockées dans la même table, les versions actuelles et anciennes des lignes. Cela peut ajouter une surcharge lorsque vous interrogez uniquement les données récentes. Il est possible d'utiliser des partitions pour réduire cette surcharge en créant une ou plusieurs partitions pour stocker les données historiques et une pour stocker les versions récentes des lignes. Ensuite, en utilisant l'élagage des partitions, MariaDB sera en mesure de réduire la quantité de données à interroger pour obtenir le résultat de la requête :

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

  );

Vous pouvez également utiliser d'autres moyens de partitionnement comme, par exemple, définir le nombre de lignes à stocker par partition.

Lorsque vous utilisez le partitionnement, nous pouvons désormais appliquer les meilleures pratiques de partitionnement régulières comme la rotation des données en supprimant les anciennes partitions. Si vous n'avez pas créé de partitions, vous pouvez toujours le faire via des commandes telles que :

DELETE HISTORY FROM mytable;

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

Si nécessaire, vous pouvez exclure certaines colonnes du contrôle de version :

CREATE TABLE mytable (

   a INT,

   b INT WITHOUT SYSTEM VERSIONING

) WITH SYSTEM VERSIONING;

Dans MariaDB 10.4, une nouvelle option a été ajoutée, les périodes d'application. Cela signifie, en gros, qu'au lieu de l'heure système, il est possible de créer un versionnage basé sur deux colonnes (basées sur l'heure) dans le tableau :

CREATE TABLE mytable (

   a INT, 

   date1 DATE,

   date2 DATE,

   PERIOD FOR date_period(date1, date2));

Il est également possible de mettre à jour ou de supprimer des lignes en fonction du temps (UPDATE FOR PORTION et DELETE FOR PORTION). Il est également possible de combiner la gestion des versions au moment de l'application et au moment du système dans une seule table.

Exemples de tables temporelles dans MariaDB

Ok, nous avons discuté des possibilités, examinons certaines des choses que nous pouvons faire avec les tables temporelles.

Pour commencer, créons un tableau et remplissons-le avec quelques données :

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)

Maintenant, mettons à jour quelques lignes :

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

Maintenant, voyons toutes les lignes stockées dans la table :

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)

Comme vous pouvez le constater, le tableau contient non seulement les versions actuelles des lignes, mais également les valeurs d'origine, antérieures à leur mise à jour.

Maintenant, vérifions l'heure, puis ajoutons quelques lignes supplémentaires. Nous verrons si nous pouvons voir les versions actuelles et passées.

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;

Maintenant, vérifions le contenu de la table. Uniquement les versions actuelles des lignes :

MariaDB [versioned]> SELECT * FROM mytable;

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

| a    | b    |

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

|    1 |    3 |

|    2 |    2 |

|    3 |    1 |

|    4 |    1 |

|    5 |    1 |

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

5 rows in set (0.000 sec)

Ensuite, accédons à l'état de la table avant de faire les insertions et les mises à jour :

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)

Fonctionne comme prévu, nous ne voyons que trois lignes dans le tableau.

Ce court exemple n'est en aucun cas extensif. Nous voulions vous donner une idée de la façon dont vous pouvez utiliser les tables temporelles. Les applications de celle-ci sont nombreuses. Meilleur suivi de l'état de la commande en e-commerce, versioning du contenu (fichiers de configuration, documents), aperçu des données passées à des fins d'analyse.

Pour être clair, cette fonctionnalité peut être implémentée à l'aide de tables "traditionnelles", tant que vous continuez à insérer des lignes, sans les mettre à jour, mais la gestion est beaucoup plus facile à faire lorsque vous utilisez des tables temporelles.