MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Bảng tạm thời của MariaDB là gì?

Bắt đầu từ ngày 10.3.4, MariaDB đi kèm với các bảng thời gian. Nó vẫn là một tính năng khá phổ biến và chúng tôi muốn thảo luận một chút về những bảng đó là gì và chúng có thể hữu ích cho việc gì.

Trước hết, trong trường hợp ai đó đã đọc nhầm tiêu đề của blog này, chúng ta đang nói ở đây về bảng tạm thời, không phải bảng tạm thời, cũng tồn tại trong MariaDB. Tuy nhiên, họ có một số điểm chung. Thời gian. Các bảng tạm thời tồn tại trong thời gian ngắn, mặt khác, các bảng tạm thời được thiết kế để cung cấp quyền truy cập vào dữ liệu theo thời gian. Nói tóm lại, bạn có thể xem bảng tạm thời như một bảng đã được phiên bản có thể được sử dụng để truy cập và sửa đổi dữ liệu trong quá khứ, tìm những thay đổi nào đã được thực hiện và khi nào. Nó cũng có thể được sử dụng để khôi phục dữ liệu về một thời điểm cụ thể.

Cách sử dụng Bảng tạm trong MariaDB

Để tạo một bảng tạm thời, chúng ta chỉ cần thêm "VỚI PHIÊN BẢN HỆ THỐNG" vào lệnh CREATE TABLE. Nếu bạn muốn chuyển đổi bảng thông thường thành bảng tạm thời, bạn có thể chạy:

ALTER TABLE mytable ADD SYSTEM VERSIONING;

Đây là tất cả. Một bảng tạm thời sẽ được tạo và bạn có thể bắt đầu truy vấn dữ liệu của nó. Có một số cách để làm điều đó.

Đầu tiên, chúng ta có thể sử dụng SELECT để truy vấn dữ liệu vào thời điểm cụ thể:

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

Bạn cũng có thể thực hiện truy vấn cho một dải ô:

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

Cũng có thể hiển thị tất cả dữ liệu:

SELECT * FROM mytable FOR SYSTEM_TIME ALL;

Nếu cần, bạn có thể tạo chế độ xem từ các bảng tạm thời, theo cùng một mẫu như chúng tôi đã trình bày ở trên.

Cho rằng các hàng giống nhau có thể không được cập nhật trên tất cả các nút cùng một lúc (ví dụ:sự chậm trễ do sao chép), nếu bạn muốn xem chính xác cùng một trạng thái của dữ liệu trên nhiều nô lệ, bạn có thể xác định thời điểm bằng id giao dịch InnoDB:

SELECT * FROM mytable FOR SYSTEM_TIME AS OF TRANSACTION 123;

Theo mặc định, tất cả dữ liệu được lưu trữ trong cùng một bảng, cả phiên bản hiện tại và cũ của các hàng. Điều này có thể thêm một số chi phí khi bạn chỉ truy vấn dữ liệu gần đây. Có thể sử dụng phân vùng để giảm chi phí này bằng cách tạo một hoặc nhiều phân vùng để lưu trữ dữ liệu lịch sử và một phân vùng để lưu trữ các phiên bản gần đây của các hàng. Sau đó, bằng cách sử dụng tính năng cắt bớt phân vùng, MariaDB sẽ có thể giảm lượng dữ liệu mà nó phải truy vấn để đưa ra kết quả cho truy vấn:

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

  );

Bạn cũng có thể sử dụng các phương tiện phân vùng khác như xác định số lượng hàng để lưu trữ trên mỗi phân vùng.

Khi sử dụng tính năng phân vùng, giờ đây chúng ta có thể áp dụng các phương pháp hay nhất về phân vùng thông thường như xoay vòng dữ liệu bằng cách loại bỏ các phân vùng cũ. Nếu bạn không tạo phân vùng, bạn vẫn có thể làm điều đó thông qua các lệnh như:

DELETE HISTORY FROM mytable;

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

Nếu cần, bạn có thể loại trừ một số cột khỏi lập phiên bản:

CREATE TABLE mytable (

   a INT,

   b INT WITHOUT SYSTEM VERSIONING

) WITH SYSTEM VERSIONING;

Trong MariaDB 10.4, một tùy chọn mới đã được thêm vào, khoảng thời gian ứng dụng. Về cơ bản, ý nghĩa là thay vì thời gian hệ thống, có thể tạo lập phiên bản dựa trên hai cột (dựa trên thời gian) trong bảng:

CREATE TABLE mytable (

   a INT, 

   date1 DATE,

   date2 DATE,

   PERIOD FOR date_period(date1, date2));

Cũng có thể cập nhật hoặc xóa các hàng dựa trên thời gian (CẬP NHẬT CHO CỔNG VÀ XÓA CHO CỔNG). Cũng có thể kết hợp phiên bản thời gian ứng dụng và thời gian hệ thống trong một bảng.

Ví dụ về Bảng tạm trong MariaDB

Được rồi, chúng ta đã thảo luận về các khả năng, hãy xem một số điều chúng ta có thể làm với bảng thời gian.

Đầu tiên, hãy tạo một bảng và điền vào nó một số dữ liệu:

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)

Bây giờ, hãy cập nhật vài hàng:

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

Bây giờ, hãy xem tất cả các hàng được lưu trữ trong bảng:

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)

Như bạn có thể thấy, bảng không chỉ chứa các phiên bản hiện tại của các hàng mà còn chứa các giá trị gốc, từ trước khi chúng tôi cập nhật chúng.

Bây giờ, hãy kiểm tra xem thời gian là bao nhiêu rồi thêm một số hàng khác. Chúng tôi sẽ xem liệu chúng tôi có thể thấy phiên bản hiện tại và phiên bản trước đây hay không.

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;

Bây giờ, hãy kiểm tra nội dung của bảng. Chỉ phiên bản hiện tại của các hàng:

MariaDB [versioned]> SELECT * FROM mytable;

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

| a    | b    |

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

|    1 |    3 |

|    2 |    2 |

|    3 |    1 |

|    4 |    1 |

|    5 |    1 |

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

5 rows in set (0.000 sec)

Sau đó, hãy truy cập trạng thái của bảng trước khi chúng tôi thực hiện chèn và cập nhật:

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)

Hoạt động như mong đợi, chúng tôi chỉ thấy ba hàng trong bảng.

Ví dụ ngắn này không có nghĩa là bao quát. Chúng tôi muốn cung cấp cho bạn một số ý tưởng về cách bạn có thể vận hành các bảng thời gian. Ứng dụng của điều này là rất nhiều. Theo dõi tốt hơn trạng thái của đơn đặt hàng trong thương mại điện tử, phân tích phiên bản nội dung (tệp cấu hình, tài liệu), thông tin chi tiết về dữ liệu quá khứ cho mục đích phân tích.

Nói rõ hơn, tính năng này có thể được triển khai bằng bảng “truyền thống”, miễn là bạn tiếp tục chèn các hàng, không cập nhật chúng, nhưng việc quản lý sẽ dễ thực hiện hơn khi sử dụng bảng tạm thời.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách bảo vệ cơ sở dữ liệu MySQL hoặc MariaDB của bạn khỏi SQL Injection:Phần thứ hai

  2. Sử dụng sao chép cụm MySQL Galera để tạo một cụm phân tán theo địa lý:Phần một

  3. Điều cần kiểm tra xem Mức độ sử dụng I / O của MySQL có cao không

  4. Cách SQRT () hoạt động trong MariaDB

  5. Lựa chọn công cụ lưu trữ:Aria