Mục lục
PARTITION SQL LÀ GÌ?
Partition SQL là kỹ thuật phân chia một bảng (table) trong cơ sở dữ liệu thành các phần nhỏ dựa trên một logic nhất định, thường theo một column key cụ thể trong bảng. Việc phân chia này giúp cải thiện hiệu suất truy vấn dữ liệu bằng cách chỉ truy xuất dữ liệu trong phân vùng cần thiết, thay vì quét qua toàn bộ bảng.
Trong MySQL và nhiều hệ quản trị cơ sở dữ liệu khác, dữ liệu được lưu trữ dưới dạng bảng với các hàng và cột. Khi thực hiện truy vấn, DB engine (bộ xử lý cơ sở dữ liệu) phải quét qua toàn bộ bảng để lấy dữ liệu, dẫn đến hiệu suất bị chậm nếu bảng chứa quá nhiều bản ghi. Partition SQL giúp giải quyết vấn đề này bằng cách giảm lượng dữ liệu cần duyệt, từ đó tối ưu tốc độ truy vấn.
Dưới đây là một ví dụ minh họa cách SQL PARTITION hoạt động để bạn có thể hình dung rõ hơn về kỹ thuật này.
>> Đọc thêm:
KHOÁ HỌC SQL NÂNG CAO
KHÓA HỌC DATA WAREHOUSE : TỔNG HỢP, CHUẨN HÓA VÀ XÂY DỰNG KHO DỮ LIỆU
KHÓA HỌC DATA MODEL – THIẾT KẾ MÔ HÌNH DỮ LIỆU
LỘ TRÌNH TRỞ THÀNH KỸ SƯ DỮ LIỆU (DATA ENGINEER)
Ví dụ chúng ta có table persons chưa hề được tạo partition, và có các trường dữ liệu cụ thể như sau:
Table này khi tạo ra mặc định sẽ được lưu trữ thành 1 chunk trong file system
Khi sử dụng partition, table sẽ được phân chia thành nhiều chunk với key mà chúng ta đã định nghĩa. Ví dụ ở đây mình dùng trường age làm key.
Chúng ta có thể test độ hiệu quả của partition bằng câu truy vấn đơn giản như sau:
select * from persons where age = 24
Trong trường hợp chưa dùng partition thời gian thực thi query là 0.00064 sec.
Do table của chúng ta đang có ít dữ liệu nên độ hiệu quả khó có thể cảm nhận được, tuy nhiên với những cơ sở dữ liệu có hàng triệu bản ghi thì đây thực sự là một giải pháp tuyệt vời.
Như vậy qua ví dụ trên bạn đã phần nào hiểu về SQL PARTITION là gì và tác dụng của nó như nào, bây giờ chúng ta cùng đi vào chi tiết hơn nhé.
CÁCH TẠO PARTITION TRONG SQL
Trước khi tạo partition, bạn cần đảm bảo rằng cột (column) bạn chọn để tạo partition là cột được sử dụng thường xuyên trong các truy vấn. Điều này giúp việc phân vùng thực sự tối ưu hiệu suất truy vấn.
Bạn có thể tạo partition bằng cách sử dụng lệnh CREATE TABLE khi tạo bảng mới, hoặc lệnh ALTER TABLE để thêm partition vào bảng đã tồn tại.
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
CÁC KIỂU PARTITION SQL CHÍNH
SQL Partitioning có nhiều loại, bao gồm:
- Range Partitioning
- List Partitioning
- Columns Partitioning
- Hash Partitioning
- Key Partitioning
- Sub Partitioning
Trong bài viết này, chúng ta sẽ tập trung vào hai loại partition phổ biến nhất: Range Partitioning và List Partitioning. Các kiểu khác sẽ được giới thiệu chi tiết trong một bài viết khác nhé.
>> Đọc thêm:
KHOÁ HỌC SQL NÂNG CAO
KHÓA HỌC DATA WAREHOUSE : TỔNG HỢP, CHUẨN HÓA VÀ XÂY DỰNG KHO DỮ LIỆU
KHÓA HỌC DATA MODEL – THIẾT KẾ MÔ HÌNH DỮ LIỆU
LỘ TRÌNH TRỞ THÀNH KỸ SƯ DỮ LIỆU (DATA ENGINEER)
KIỂU 1: RANGE PARTITIONING
Range Partitioning hiểu đơn giản là phân vùng theo khoảng mà bạn muốn sử dụng, tức là chia table ra thành nhiều khoảng giá trị. Các khoảng giá trị này phải liên tiếp và không chồng chéo lên nhau.
Ví dụ: Ví dụ: để phân vùng dữ liệu theo tháng trong 1 năm, bạn có thể chia thành 12 khoảng liên tục:
- P1: 01-01-2020 đến 31-01-2020
- P2: 01-02-2020 đến 29-02-2020
- P3: 01-03-2020 đến 30-03-2020
Mục đích của chia vùng theo khoảng sẽ giúp việc insert và tìm kiếm nhanh hơn rất nhiều. Khi insert, nếu giá trị nằm trong khoảng nào, nó sẽ được insert vào đúng khoảng đã định sẵn, và khi tìm kiếm cũng vậy.
Lưu ý: Việc tạo range partitioning yêu cầu từ khóa VALUE LESS THAN để chỉ định phạm vi cần sử dụng.
Cùng xem ví dụ cụ thể về Range Partitioning như sau:
mysql> CREATE TABLE sales (no INT NOT NULL, date TIMESTAMP NOT NULL,
code VARCHAR(15) NOT NULL, amount INT NOT NULL)
PARTITION BY RANGE (amount) (
PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (300),
PARTITION p2 VALUES LESS THAN (700),
PARTITION p3 VALUES LESS THAN (1000));
Query OK, 0 rows affected (1.34 sec)
Ở đây chúng ta đã tạo ra một table sales
cùng với 4 partition được chỉ định rõ phạm vi sử dụng, p0 là sẽ lưu trữ những record có amount
< 100. p2 sẽ có 100 <= amount
< 300 Tương tự với các partition còn lại.
Bây giờ chúng ta cùng insert vào table này:
mysql> INSERT INTO sales VALUES
(1, '2013-01-02', 'C001', 50),
(2, '2013-01-25', 'C003', 80),
(3, '2013-02-15', 'C012', 250),
(4, '2013-03-26', 'C345', 300),
(5, '2013-04-19', 'C234', 400),
(6, '2013-05-31', 'C743', 500),
(7, '2013-06-11', 'C234', 750),
(8, '2013-07-24', 'C003', 800),
và khi select ra chúng ta cùng xem kết quả
mysql> SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='sales';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p0 | 2 |
| p1 | 1 |
| p2 | 3 |
| p3 | 2 |
+----------------+------------+
KIỂU 2: LIST PARTITIONING
Khác với Range Partitioning, List Partitioning không phân chia theo khoảng mà phân chia dựa trên danh sách các giá trị cụ thể.
Với loại Partitioning này, chúng ta sẽ dùng từ khóa VALUES IN (list_value) để tạo partition.
Cũng lấy ví dụ trên, nhưng thêm một chút trong bảng sales, chúng ta có thêm cột mã nhân viên sale là saler_id để biết là nhân viên nào đã bán.
Ví dụ, trong một công ty, chúng ta có 10 nhân viên sale cùng với 3 nhóm sale. Mỗi nhóm làm việc ở một đoạn đường do cấp trên yêu cầu.
Ví dụ:
- Nhóm A làm việc ở Phạm Văn Đồng
- Nhóm B làm việc ở Trần Duy Hưng
- Nhóm C làm việc ở Láng
Bây giờ cùng tạo table sales như sau:
mysql> CREATE TABLE sales (no INT NOT NULL, date TIMESTAMP NOT NULL,
code VARCHAR(15) NOT NULL, amount INT NOT NULL, saler_id INT NOT NULL)
PARTITION BY LIST(saler_id) (
PARTITION pA VALUES IN (1,2,5),
PARTITION pB VALUES IN (3,4,8),
PARTITION pC VALUES IN (6,7,9,10));
Query OK, 0 rows affected (1.34 sec)
DELETE PARTITION
Để xóa Partition:
Nếu trong quá trình vận hành hệ thống, bạn không cần một lượng data nào đó nữa, bạn có thể xóa chúng đi bằng cách xóa chính partition đã định nghĩa.
MySQL> ALTER TABLE sales TRUNCATE PARTITION p0;
TẠM KẾT
Như vậy trong bài viết này, INDA Academy đã giới thiệu cho các bạn tổng quan về PARTITION SQL: Khái niệm, mục đích sử dụng của Mysql partition
, và 2 loại partition chính hay được sử dụng là Range partition và List partition
.
Hy vọng đây sẽ là kiến thức bổ ích giúp các bạn tối ưu truy vấn trong quá trình làm dự án với những database lớn. Bài viết có thể còn nhiều thiếu sót , cũng như việc sử dụng từ ngữ partition
và partitioning
còn nhầm lẫn. Mong các bạn đóng góp và hẹn các bạn trong bài viết sớm nhất về 4 loại mysql
partition còn lại nhé.
CÂU HỎI THƯỜNG GẶP VỀ PARTITION SQL
1. Partition SQL là gì và khi nào nên áp dụng?
Partition SQL là kỹ thuật chia một bảng trong cơ sở dữ liệu thành nhiều phần nhỏ hơn (phân vùng) dựa trên các tiêu chí nhất định, giúp tăng tốc độ truy vấn. Việc áp dụng Partition SQL phù hợp khi bảng dữ liệu có dung lượng lớn và bạn chỉ cần truy vấn một phần dữ liệu cụ thể.
2. Over Partition trong SQL Server là gì và sử dụng như thế nào?
“Over Partition” trong SQL Server là một tính năng sử dụng cùng các hàm phân tích, như ROW_NUMBER()
, RANK()
, và SUM()
. Nó giúp chia nhỏ kết quả theo cột chỉ định để tính toán hoặc xếp hạng dữ liệu theo nhóm, rất hữu ích trong các bài toán tổng hợp và phân tích.
3. Có những kiểu partition SQL nào, và chúng khác nhau ra sao?
Các kiểu partition chính gồm Range Partitioning, List Partitioning, Columns Partitioning, Hash Partitioning, và Key Partitioning. Mỗi kiểu phân chia dữ liệu theo cách khác nhau: ví dụ, Range dựa trên các khoảng giá trị liên tiếp, còn List dựa trên danh sách giá trị cụ thể.
4. Range Partitioning trong SQL là gì và lợi ích khi sử dụng?
Range Partitioning chia dữ liệu thành các khoảng giá trị liên tiếp, ví dụ như các tháng trong một năm. Lợi ích của Range Partitioning là giúp truy vấn và cập nhật dữ liệu hiệu quả hơn khi chỉ cần làm việc với một khoảng giá trị nhất định, thay vì toàn bộ bảng.
5. Over Partition trong SQL Server có khác gì so với Partition SQL thông thường?
Partition SQL thường chỉ việc chia bảng thành các phần nhỏ để tăng hiệu suất truy vấn, còn Over Partition trong SQL Server là một cú pháp dùng trong hàm phân tích, giúp thực hiện tính toán trên các nhóm dữ liệu cụ thể mà không phải chia bảng thật sự.
>> Đọc thêm:
KHOÁ HỌC SQL NÂNG CAO
KHÓA HỌC DATA WAREHOUSE : TỔNG HỢP, CHUẨN HÓA VÀ XÂY DỰNG KHO DỮ LIỆU
KHÓA HỌC DATA MODEL – THIẾT KẾ MÔ HÌNH DỮ LIỆU
LỘ TRÌNH TRỞ THÀNH KỸ SƯ DỮ LIỆU (DATA ENGINEER)