MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Apa Itu Tabel Temporal MariaDB?

Mulai dari 10.3.4, MariaDB hadir dengan tabel temporal. Ini masih merupakan fitur yang tidak umum dan kami ingin membahas sedikit tentang tabel tersebut dan kegunaannya.

Pertama-tama, jika seseorang salah membaca judul blog ini, kita berbicara di sini tentang tabel temporal, bukan tabel sementara, yang juga ada di MariaDB. Mereka memiliki kesamaan, meskipun. Waktu. Tabel sementara berumur pendek, tabel temporal di sisi lain dirancang untuk memberikan akses ke data dari waktu ke waktu. Singkatnya, Anda dapat melihat tabel temporal sebagai tabel berversi yang dapat digunakan untuk mengakses dan mengubah data masa lalu, menemukan perubahan apa yang telah dibuat dan kapan. Ini juga dapat digunakan untuk mengembalikan data ke titik waktu tertentu.

Cara Menggunakan Tabel Temporal di MariaDB

Untuk membuat tabel temporal kita hanya perlu menambahkan "DENGAN VERSION SISTEM" ke perintah CREATE TABLE. Jika Anda ingin mengonversi tabel biasa menjadi tabel temporal, Anda dapat menjalankan:

ALTER TABLE mytable ADD SYSTEM VERSIONING;

Ini cukup banyak. Tabel temporal akan dibuat dan Anda dapat mulai mengkueri datanya. Ada beberapa cara untuk melakukannya.

Pertama, kita dapat menggunakan SELECT untuk mengkueri data pada waktu tertentu:

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

Anda juga dapat melakukan kueri untuk rentang:

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

Hal ini juga memungkinkan untuk menampilkan semua data:

SELECT * FROM mytable FOR SYSTEM_TIME ALL;

Jika diperlukan, Anda dapat membuat tampilan dari tabel temporal, mengikuti pola yang sama seperti yang telah kami tunjukkan di atas.

Mengingat bahwa baris yang sama mungkin tidak diperbarui pada semua node secara bersamaan (misalnya, penundaan yang disebabkan oleh replikasi), jika Anda ingin melihat status data yang sama persis di seluruh beberapa budak, Anda dapat menentukan titik waktu menggunakan id transaksi InnoDB:

SELECT * FROM mytable FOR SYSTEM_TIME AS OF TRANSACTION 123;

Secara default, semua data disimpan dalam tabel yang sama, baik versi baris saat ini maupun versi lama. Ini mungkin menambahkan beberapa overhead ketika Anda hanya menanyakan data terbaru. Dimungkinkan untuk menggunakan partisi untuk mengurangi overhead ini dengan membuat satu atau lebih partisi untuk menyimpan data historis dan satu untuk menyimpan versi terbaru dari baris. Kemudian, menggunakan pemangkasan partisi, MariaDB akan dapat mengurangi jumlah data yang harus dikueri untuk mendapatkan hasil kueri:

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

  );

Anda juga dapat menggunakan cara lain untuk mempartisi seperti, misalnya, menentukan jumlah baris yang akan disimpan per partisi.

Saat menggunakan partisi, sekarang kita dapat menerapkan praktik terbaik partisi biasa seperti rotasi data dengan menghapus partisi lama. Jika Anda tidak membuat partisi, Anda masih dapat melakukannya melalui perintah seperti:

DELETE HISTORY FROM mytable;

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

Jika perlu, Anda dapat mengecualikan beberapa kolom dari pembuatan versi:

CREATE TABLE mytable (

   a INT,

   b INT WITHOUT SYSTEM VERSIONING

) WITH SYSTEM VERSIONING;

Di MariaDB 10.4 opsi baru telah ditambahkan, periode waktu aplikasi. Artinya, pada dasarnya, bahwa alih-alih waktu sistem, dimungkinkan untuk membuat pembuatan versi berdasarkan dua kolom (berbasis waktu) dalam tabel:

CREATE TABLE mytable (

   a INT, 

   date1 DATE,

   date2 DATE,

   PERIOD FOR date_period(date1, date2));

Hal ini juga memungkinkan untuk memperbarui atau menghapus baris berdasarkan waktu (UPDATE FOR PORTION dan DELETE FOR PORTION). Dimungkinkan juga untuk mencampur versi waktu aplikasi dan waktu sistem dalam satu tabel.

Contoh Tabel Temporal di MariaDB

Oke, kita telah membahas kemungkinannya, mari kita lihat beberapa hal yang dapat kita lakukan dengan tabel temporal.

Pertama, mari kita buat tabel dan isi dengan beberapa data:

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)

Sekarang, mari kita perbarui beberapa baris:

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

Sekarang, mari kita lihat semua baris yang tersimpan dalam tabel:

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)

Seperti yang Anda lihat, tabel tidak hanya berisi versi baris saat ini tetapi juga nilai asli, dari sebelum kami memperbaruinya.

Sekarang, mari kita periksa jam berapa sekarang dan tambahkan beberapa baris lagi. Kami akan melihat apakah kami dapat melihat versi saat ini dan versi sebelumnya.

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;

Sekarang, mari kita periksa isi tabel. Hanya versi baris saat ini:

MariaDB [versioned]> SELECT * FROM mytable;

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

| a    | b    |

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

|    1 |    3 |

|    2 |    2 |

|    3 |    1 |

|    4 |    1 |

|    5 |    1 |

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

5 rows in set (0.000 sec)

Kemudian, mari kita mengakses status tabel sebelum kita melakukan penyisipan dan pembaruan:

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)

Berfungsi seperti yang diharapkan, kami hanya melihat tiga baris dalam tabel.

Contoh singkat ini sama sekali tidak ekstensif. Kami ingin memberi Anda beberapa ide bagaimana Anda dapat mengoperasikan tabel temporal. Aplikasi ini sangat banyak. Pelacakan status pesanan dalam e-niaga dengan lebih baik, membuat versi konten (file konfigurasi, dokumen), wawasan tentang data masa lalu untuk tujuan analitis.

Untuk memperjelas, fitur ini dapat diimplementasikan menggunakan tabel “tradisional”, asalkan Anda tetap memasukkan baris, bukan memperbaruinya, tetapi pengelolaannya jauh lebih mudah dilakukan saat menggunakan tabel temporal.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. HA untuk MySQL dan MariaDB - Membandingkan Replikasi Master-Master dengan Galera Cluster

  2. Bagaimana DEGREES() Bekerja di MariaDB

  3. Bagaimana CHAR() Bekerja di MariaDB

  4. Cara Mengurangi Hari dari Tanggal di MariaDB

  5. Bagaimana ORD() Bekerja di MariaDB