Giới thiệu về partitioning trong MySQL

MySQL partitioning là gì ? Nó bao gồm những loại nào, ưu điểm của nó là gì và làm thế nào để biết được database của bạn hỗ trợ nó. Trong bài viết này tôi sẽ nói cho bạn biết về những điều đó. 1. MySQL partitioning là gì ? Đầu tiên chúng ta phải hiểu partitioning chính là quá trình phân chia table ở cấp độ thấp, bạn cứ hình dung mỗi table của ta nhưng 1 cái kho chứa hàng, thì partition chính là các ngăn nhỏ hơn bên trong cái kho đó. Điều đó cũng có nghĩa khi bạn tìm kiếm dữ liệu, database chỉ cần search trong phạm vi 1 hoặc vài partition nào đó, giúp giảm thời gian truy vấn dữ liệu. Thực hiện hiện partition table trong một số trường hợp giúp ta optimizing database. Cùng xem 1 ví dụ về cách tạo partition trong MySQL: CREATE TABLE table_name (column_id INT, column_01 DECIMAL(7,2), column_date DATE) ENGINE=INNODB PARTITION BY HASH( MONTH(column_date) ) PARTITIONS 6;

2. Cùng nói về 1 số lợi ích cửa việc partitioning:

  • Storage: Có thể lưu nhiều dữ liệu hơn trong một bảng hơn là lưu trữ trên single disk hay file system partition.
  • Deletion: drop cả một partiton nào đó đi sẽ rất nhanh, nhất là với những bảng có nhiều dữ liệu thì việc delete dữ liệu trở lên đơn giản hơn rất nhiều.
  • Query: truy vấn dữ liệu sẽ nhanh hơn nếu trong câu query của bạn có chỉ định rõ partition.

3. Làm sao để biết được store engine của bạn có hỗ trợ partition hay không ?

  • Đơn giản để biết được store engine có hỗ trợ hay không, ta chỉ cần chạy lệnh SHOW PLUGINS:
mysql> SHOW PLUGINS;
+------------+----------+----------------+---------+---------+
| Name       | Status   | Type           | Library | License |
+------------+----------+----------------+---------+---------+
| binlog     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| partition  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| CSV        | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| FEDERATED  | DISABLED | STORAGE ENGINE | NULL    | GPL     |
| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| ndbcluster | DISABLED | STORAGE ENGINE | NULL    | GPL     |
+------------+----------+----------------+---------+---------+
11 rows in set (0.00 sec)
  • hoặc thực hiện câu truy vấn sau:
mysql> SELECT
    ->     PLUGIN_NAME as Name,
    ->     PLUGIN_VERSION as Version,
    ->     PLUGIN_STATUS as Status
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_TYPE='STORAGE ENGINE';
+--------------------+---------+--------+
| Name               | Version | Status |
+--------------------+---------+--------+
| binlog             | 1.0     | ACTIVE |
| CSV                | 1.0     | ACTIVE |
| MEMORY             | 1.0     | ACTIVE |
| MRG_MYISAM         | 1.0     | ACTIVE |
| MyISAM             | 1.0     | ACTIVE |
| PERFORMANCE_SCHEMA | 0.1     | ACTIVE |
| BLACKHOLE          | 1.0     | ACTIVE |
| ARCHIVE            | 3.0     | ACTIVE |
| InnoDB             | 5.7     | ACTIVE |
| partition          | 1.0     | ACTIVE |
+--------------------+---------+--------+
10 rows in set (0.00 sec)

**4. Partition bao gồm những loại nào ? ** Gồm 4 loại là RANGE, LIST, HASH and KEY. a. RANGE Partitioning Loại này chỉ định 1 table row sẽ được lưu tại partition nào dựa vào giá trị của 1 column. Các giá trị nên được liên tiếp, nhưng chúng không nên chồng chéo lẫn nhau.Toán tử "VALUES LESS THAN" sẽ được sử dụng để định nghĩa dải giá tri. Trong ví dụ dưới đây, những row có cùng 1 năm sẽ được lưu trữ trong cùng 1 partition.

CREATE TABLE userslogs (
    username VARCHAR(20) NOT NULL,
    logdata BLOB NOT NULL,
    created DATETIME NOT NULL,
    PRIMARY KEY(username, created)
)
PARTITION BY RANGE( YEAR(created) )(
    PARTITION from_2013_or_less VALUES LESS THAN (2014),
    PARTITION from_2014 VALUES LESS THAN (2015),
    PARTITION from_2015 VALUES LESS THAN (2016),
    PARTITION from_2016_and_up VALUES LESS THAN MAXVALUE

b. LIST Partitioning. Kiểu này rất giống với Rangeg, nhưng khác ở chỗ giá trị của column để xác định partition phải nằm trong 1 list được định nghĩa trước. Tóa tử "VALUES IN" được sử dụng trong trường hợp này. Hãy cùng xem 1 ví dụ sau:

CREATE TABLE serverlogs (
    serverid INT NOT NULL, 
    logdata BLOB NOT NULL,
    created DATETIME NOT NULL
)
PARTITION BY LIST (serverid)(
    PARTITION server_east VALUES IN(1,43,65,12,56,73),
    PARTITION server_west VALUES IN(534,6422,196,956,22)
);

c. HASH Partitioning. Đây là loại partition mà sử dụng chính dữ liệu của cột để xác đinh table row đó sẽ được lưu trữ ở đâu. Không giống như LIST hay RANGE, nơi mà giá trị xác định partition đã được xác định trước. HASH thường xử dụng để phân phối đồng đều giữa các partion. Chú ý rằng giá trị của cột được sử dụng để partion phải là dạng INTEGER. Ví dụ sau sẽ tạo 1 bảng có 10 partition dạng HASH:

CREATE TABLE serverlogs2 (
    serverid INT NOT NULL, 
    logdata BLOB NOT NULL,
    created DATETIME NOT NULL
)
PARTITION BY HASH (serverid)
PARTITIONS 10
```;

d. KEY Partitioning.
Đây là loại rất giống với HASH nhưng nó khác ở chỗ, giá trị để xác định partion nằm trên 1 hoặc nhiều column khác nhau, giá trị không nhất thiết phải là Integer.
Ví dụ sau sẽ tạo 1 Key partition với việc không chỉ định rõ key, khi đó MySQL sẽ tự động lấy PrimariKey hoặc Unikey để sử dụng:

CREATE TABLE serverlogs4 ( serverid INT NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, UNIQUE KEY (serverid) ) PARTITION BY KEY() PARTITIONS 10;

Ví dụ chỉ định rõ Key:

CREATE TABLE serverlogs5 ( serverid INT NOT NULL, logdata BLOB NOT NULL, created DATETIME NOT NULL, label VARCHAR(10) NOT NULL ) PARTITION BY KEY(serverid, label, created) PARTITIONS 10;


Qua 1 số thông tin trên, các bạn có thể hiểu được cách tổng quát về MySQL partitioning và sử dụng nó thế nào cho hợp lý tùy thuộc vào cấu trúc dữ liệu và nghiệp vụ của hệ thống.