Vanaf 10.3.4 wordt MariaDB geleverd met tijdelijke tabellen. Het is nog steeds een vrij ongebruikelijke functie en we willen graag wat bespreken wat die tabellen zijn en waarvoor ze nuttig kunnen zijn.
Allereerst, voor het geval iemand de titel van deze blog verkeerd heeft gelezen, hebben we het hier over tijdelijke tabellen, niet over tijdelijke tabellen, die ook in MariaDB bestaan. Toch hebben ze iets gemeen. Tijd. Tijdelijke tabellen zijn van korte duur, temporele tabellen daarentegen zijn ontworpen om in de loop van de tijd toegang te geven tot de gegevens. Kortom, u kunt tijdelijke tabellen zien als een tabel met versiebeheer die kan worden gebruikt om gegevens uit het verleden te openen en te wijzigen, om te zien welke wijzigingen zijn aangebracht en wanneer. Het kan ook worden gebruikt om gegevens terug te draaien naar een bepaald tijdstip.
Tijdelijke tabellen gebruiken in MariaDB
Om een tijdelijke tabel te maken, hoeven we alleen maar “WITH SYSTEM VERSIONING” toe te voegen aan het CREATE TABLE-commando. Als u een gewone tabel in een tijdelijke tabel wilt converteren, kunt u het volgende uitvoeren:
ALTER TABLE mytable ADD SYSTEM VERSIONING;
Dit is zo'n beetje alles. Er wordt een tijdelijke tabel gemaakt en u kunt beginnen met het opvragen van de gegevens. Er zijn een aantal manieren om dat te doen.
Ten eerste kunnen we SELECT gebruiken om gegevens vanaf een bepaald tijdstip op te vragen:
SELECT * FROM mytable FOR SYSTEM_TIME AS OF TIMESTAMP ‘2020-06-26 10:00:00’;
U kunt ook een zoekopdracht uitvoeren voor een bereik:
SELECT * FROM mytable FOR SYSTEM_TIME FROM ‘2020-06-26 08:00:00’ TO ‘2020-06-26 10:00:00’;
Het is ook mogelijk om alle gegevens te tonen:
SELECT * FROM mytable FOR SYSTEM_TIME ALL;
Indien nodig kunt u weergaven maken van tijdelijke tabellen, volgens hetzelfde patroon als hierboven weergegeven.
Aangezien dezelfde rijen mogelijk niet op alle knooppunten tegelijkertijd worden bijgewerkt (bijvoorbeeld vertragingen veroorzaakt door replicatie), als u exact dezelfde status van de gegevens over de hele meerdere slaven, u kunt het tijdstip definiëren met behulp van de InnoDB-transactie-ID:
SELECT * FROM mytable FOR SYSTEM_TIME AS OF TRANSACTION 123;
Standaard worden alle gegevens in dezelfde tabel opgeslagen, zowel de huidige als de oude versies van de rijen. Dit kan enige overhead toevoegen wanneer u alleen de recente gegevens opvraagt. Het is mogelijk om partities te gebruiken om deze overhead te verminderen door een of meer partities te maken om historische gegevens op te slaan en een om recente versies van de rijen op te slaan. Vervolgens kan MariaDB, met behulp van partitiesnoei, de hoeveelheid gegevens verminderen die het moet opvragen om met het resultaat voor de query te komen:
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
);
Je kunt ook andere manieren gebruiken om het te partitioneren, zoals het definiëren van het aantal rijen dat per partitie moet worden opgeslagen.
Als we partitionering gebruiken, kunnen we nu normale best practices voor partitionering toepassen, zoals gegevensrotatie, door oude partities te verwijderen. Als je geen partities hebt gemaakt, kun je dat nog steeds doen met opdrachten als:
DELETE HISTORY FROM mytable;
DELETE HISTORY FROM mytable BEFORE SYSTEM_TIME '2020-06-01 00:00:00';
Indien nodig kunt u enkele kolommen uitsluiten van versiebeheer:
CREATE TABLE mytable (
a INT,
b INT WITHOUT SYSTEM VERSIONING
) WITH SYSTEM VERSIONING;
In MariaDB 10.4 is een nieuwe optie toegevoegd, toepassingsperioden. Wat het in feite betekent, is dat het in plaats van systeemtijd mogelijk is om versiebeheer te maken op basis van twee kolommen (op tijdbasis) in de tabel:
CREATE TABLE mytable (
a INT,
date1 DATE,
date2 DATE,
PERIOD FOR date_period(date1, date2));
Het is ook mogelijk om rijen bij te werken of te verwijderen op basis van de tijd (UPDATE FOR PORTION en DELETE FOR PORTION). Het is ook mogelijk om applicatie-tijd en systeem-time versiebeheer in één tabel te combineren.
Voorbeelden van tijdelijke tabellen in MariaDB
Ok, we hebben de mogelijkheden besproken, laten we eens kijken naar enkele dingen die we kunnen doen met tijdelijke tabellen.
Laten we eerst een tabel maken en deze vullen met wat gegevens:
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)
Laten we nu een paar rijen bijwerken:
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
Laten we nu alle rijen bekijken die in de tabel zijn opgeslagen:
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)
Zoals je kunt zien, bevat de tabel niet alleen de huidige versies van de rijen, maar ook originele waarden, van voordat we ze bijwerkten.
Laten we nu eens kijken hoe laat het is en dan wat meer rijen toevoegen. We zullen kijken of we de huidige en eerdere versies kunnen zien.
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;
Laten we nu de inhoud van de tabel controleren. Alleen huidige versies van de rijen:
MariaDB [versioned]> SELECT * FROM mytable;
+------+------+
| a | b |
+------+------+
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
+------+------+
5 rows in set (0.000 sec)
Laten we dan de status van de tabel bekijken voordat we de invoegingen en updates maakten:
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)
Werkt zoals verwacht, we zien maar drie rijen in de tabel.
Dit korte voorbeeld is zeker niet uitgebreid. We wilden u een idee geven hoe u de temporele tabellen kunt bedienen. Toepassingen hiervan zijn talrijk. Beter volgen van de status van de bestelling in e-commerce, versiebeheer van de inhoud (configuratiebestanden, documenten), inzicht in de gegevens uit het verleden voor analytische doeleinden.
Om het duidelijk te maken, deze functie kan worden geïmplementeerd met behulp van "traditionele" tabellen, zolang u rijen blijft invoegen en ze niet bijwerkt, maar het beheer is veel gemakkelijker te doen bij gebruik van tijdelijke tabellen.
/P>