MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Какво представляват временните таблици на MariaDB?

Започвайки от 10.3.4, MariaDB идва с временни таблици. Това все още е доста необичайна функция и бихме искали да обсъдим малко какво представляват тези таблици и за какво могат да бъдат полезни.

Първо, в случай че някой е прочел погрешно заглавието на този блог, тук говорим за временни таблици, а не за временни таблици, които също съществуват в MariaDB. Все пак имат нещо общо. Време. Временните таблици са краткотрайни, временните таблици от друга страна са предназначени да предоставят достъп до данните във времето. Накратко, можете да видите времевите таблици като таблица с версии, която може да се използва за достъп и промяна на минали данни, да намерите какви промени са направени и кога. Може да се използва и за връщане на данни до определен момент от време.

Как да използвате временни таблици в MariaDB

За да създадем временна таблица, трябва само да добавим „WITH SYSTEM VERSIONING“ към командата CREATE TABLE. Ако искате да конвертирате обикновена таблица във временна, можете да изпълните:

ALTER TABLE mytable ADD SYSTEM VERSIONING;

Това е почти всичко. Ще бъде създадена временна таблица и можете да започнете да заявявате нейните данни. Има няколко начина да направите това.

Първо, можем да използваме SELECT за запитване на данни към определен момент:

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

Можете също да направите заявка за диапазон:

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

Възможно е също да се покажат всички данни:

SELECT * FROM mytable FOR SYSTEM_TIME ALL;

Ако е необходимо, можете да създавате изгледи от времеви таблици, като следвате същия модел, както показахме по-горе.

Като се има предвид, че едни и същи редове може да не се актуализират на всички възли по едно и също време (например закъснения, причинени от репликация), ако искате да видите точно същото състояние на данните в множество подчинени устройства, можете да дефинирате момента с помощта на идентификатор на транзакция InnoDB:

SELECT * FROM mytable FOR SYSTEM_TIME AS OF TRANSACTION 123;

По подразбиране всички данни се съхраняват в една и съща таблица, както текущата, така и старата версия на редовете. Това може да доведе до допълнителни разходи, когато заявявате само последните данни. Възможно е да се използват дялове, за да се намалят тези допълнителни разходи чрез създаване на един или повече дялове за съхраняване на исторически данни и един за съхраняване на последните версии на редовете. След това, използвайки подрязването на дялове, MariaDB ще може да намали количеството данни, които трябва да поиска, за да излезе с резултата за заявката:

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

  );

Можете да използвате и други средства за разделянето му, като например дефиниране на броя редове за съхранение на дял.

Когато използваме разделяне, вече можем да прилагаме редовни най-добри практики за разделяне като ротация на данни чрез премахване на стари дялове. Ако не сте създали дялове, можете да направите това чрез команди като:

DELETE HISTORY FROM mytable;

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

Ако е необходимо, можете да изключите някои от колоните от версията:

CREATE TABLE mytable (

   a INT,

   b INT WITHOUT SYSTEM VERSIONING

) WITH SYSTEM VERSIONING;

В MariaDB 10.4 е добавена нова опция, периоди от време на приложение. Това означава по същество, че вместо системно време е възможно да се създаде версия на базата на две колони (базирани на време) в таблицата:

CREATE TABLE mytable (

   a INT, 

   date1 DATE,

   date2 DATE,

   PERIOD FOR date_period(date1, date2));

Възможно е също да актуализирате или изтривате редове въз основа на времето (АКТУАЛИЗИРАНЕ ЗА ПОРЦИЯ и ИЗТРИВАНЕ ЗА ПОРЦИЯ). Възможно е също така да се смесват версиите по време на приложение и системно време в една таблица.

Примери за временни таблици в MariaDB

Добре, обсъдихме възможностите, нека да разгледаме някои от нещата, които можем да правим с темпоралните таблици.

Първо, нека създадем таблица и да я попълним с някои данни:

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)

Сега нека актуализираме няколко реда:

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

Сега нека видим всички редове, които се съхраняват в таблицата:

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)

Както можете да видите, таблицата съдържа не само текущи версии на редовете, но и оригинални стойности, преди да ги актуализираме.

Сега нека да проверим колко е часът и след това да добавим още няколко реда. Ще видим дали можем да видим текущата и миналите версии.

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;

Сега нека проверим съдържанието на таблицата. Само текущи версии на редовете:

MariaDB [versioned]> SELECT * FROM mytable;

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

| a    | b    |

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

|    1 |    3 |

|    2 |    2 |

|    3 |    1 |

|    4 |    1 |

|    5 |    1 |

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

5 rows in set (0.000 sec)

След това нека получим достъп до състоянието на таблицата, преди да направим вмъквания и актуализации:

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)

Работи според очакванията, виждаме само три реда в таблицата.

Този кратък пример в никакъв случай не е обширен. Искахме да ви дадем някаква идея как можете да управлявате времевите таблици. Приложенията на това са многобройни. По-добро проследяване на състоянието на поръчката в електронната търговия, версия на съдържанието (конфигурационни файлове, документи), вникване в минали данни за аналитични цели.

За да стане ясно, тази функция може да бъде реализирана с помощта на „традиционни“ таблици, стига да продължавате да вмъквате редове, а не да ги актуализирате, но управлението е много по-лесно за извършване, когато използвате временни таблици.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да конвертирате в главни букви в MariaDB

  2. Как EXTRACT() работи в MariaDB

  3. Как да наблюдавате MySQL контейнери с Prometheus - внедряване на самостоятелен и рояк::Част първа

  4. MariaDB CURRENT_ROLE() Обяснено

  5. 4 начина да проверите дали таблица съществува в MariaDB