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

Thiết kế cơ sở dữ liệu 101:Các phân vùng trong MySQL

Trong bài đăng blog này, chúng ta sẽ thảo luận về một trong những tính năng được sử dụng rộng rãi nhất của MySQL - phân vùng.

Phân vùng là gì?

Trong MySQL, phân vùng là một kỹ thuật thiết kế cơ sở dữ liệu trong đó cơ sở dữ liệu chia dữ liệu thành nhiều bảng, nhưng vẫn xử lý dữ liệu như một bảng duy nhất bởi lớp SQL. Nói một cách đơn giản, khi bạn phân vùng một bảng, bạn chia nó thành nhiều bảng con:phân vùng được sử dụng vì nó cải thiện hiệu suất của một số truy vấn bằng cách cho phép chúng chỉ truy cập một phần dữ liệu, do đó làm cho chúng nhanh hơn. Hoạt động I / O cũng có thể được cải thiện vì dữ liệu và chỉ mục có thể được chia thành nhiều ổ đĩa.

Có hai kiểu phân vùng:ngang và dọc. Mặt khác, phân vùng theo chiều ngang bao gồm việc đưa các hàng khác nhau vào các bảng khác nhau, mặt khác, phân vùng dọc bao gồm việc tạo các bảng có ít cột hơn và sử dụng các bảng bổ sung để lưu trữ các cột còn lại.

Phân vùng hoạt động như thế nào?

  • Khi truy vấn SELECT được sử dụng, lớp phân vùng sẽ mở và khóa các phân vùng, trình tối ưu hóa truy vấn xác định xem có thể loại bỏ bất kỳ phân vùng nào hay không, sau đó lớp phân vùng sẽ chuyển tiếp các lệnh gọi API của trình xử lý tới công cụ lưu trữ xử lý các phân vùng.
  • Khi sử dụng các truy vấn INSERT, lớp phân vùng sẽ mở và khóa các phân vùng, xác định phân vùng nào thuộc về hàng đó, sau đó chuyển tiếp hàng đó đến phân vùng đó.
  • Khi sử dụng truy vấn DELETE, lớp phân vùng sẽ mở và khóa các phân vùng, xác định phân vùng nào chứa hàng, sau đó xóa hàng khỏi phân vùng đó.
  • Khi sử dụng các truy vấn CẬP NHẬT, lớp phân vùng sẽ mở và khóa các phân vùng, tìm ra phân vùng nào chứa hàng, tìm nạp hàng và sửa đổi hàng đó, sau đó xác định phân vùng nào sẽ chứa hàng mới, chuyển tiếp hàng đến phân vùng mới với yêu cầu chèn, sau đó chuyển tiếp yêu cầu xóa tới phân vùng ban đầu.

Khi nào bạn nên sử dụng phân vùng?

Nói chung, phân vùng hữu ích khi:

  • Bạn có nhiều dữ liệu cần truy vấn.
  • Các bảng của bạn quá lớn nên không thể vừa với bộ nhớ.
  • Các bảng của bạn chứa dữ liệu lịch sử và dữ liệu mới được thêm vào phân vùng mới nhất.
  • Bạn nghĩ rằng bạn sẽ cần phải phân phối nội dung của bảng trên các thiết bị lưu trữ khác nhau.
  • Bạn nghĩ rằng mình sẽ cần khôi phục các phân vùng riêng lẻ.

Nếu một hoặc nhiều trường hợp được mô tả ở trên mô tả tình huống của bạn, việc phân vùng có thể hữu ích. Trước khi phân vùng dữ liệu của bạn, hãy nhớ rằng phân vùng MySQL có những hạn chế riêng:

  • Biểu thức phân vùng không cho phép sử dụng các thủ tục được lưu trữ, các hàm được lưu trữ, các hàm do người dùng xác định (UDF) hoặc các phần bổ trợ và với sự hỗ trợ hạn chế cho các hàm SQL. Bạn cũng không thể sử dụng các biến đã khai báo hoặc được lưu trữ.
  • Các bảng được phân vùng không thể chứa hoặc được tham chiếu bởi các khóa ngoại.
  • Có giới hạn 1.024 phân vùng cho mỗi bảng (bắt đầu từ MariaDB 10.0.4, các bảng có thể chứa tối đa 8.192 phân vùng).
  • Một bảng chỉ có thể được phân vùng nếu công cụ lưu trữ hỗ trợ phân vùng.
  • Bộ nhớ đệm truy vấn không biết về việc phân vùng hoặc cắt bớt phân vùng.
  • Tất cả các phân vùng phải sử dụng cùng một công cụ lưu trữ.
  • Chỉ mục FullTEXT không được hỗ trợ
  • Không thể phân vùng bảng tạm thời

Các tùy chọn trên sẽ giúp bạn quyết định xem phân vùng có phải là một tùy chọn cho bạn hay không.

Các kiểu phân vùng

Nếu bạn quyết định sử dụng phân vùng, hãy nhớ rằng bạn có một số kiểu phân vùng để lựa chọn. Chúng tôi sẽ trình bày ngắn gọn các tùy chọn của bạn bên dưới, sau đó đi sâu hơn vào chúng:

  • Phân vùng theo RANGE có thể giúp bạn phân vùng các hàng dựa trên các giá trị cột nằm trong một phạm vi nhất định.
  • Phân vùng theo LIST có thể giúp bạn phân vùng các hàng dựa trên thành phần của các giá trị cột trong một danh sách nhất định.
  • Phân vùng bằng HASH có thể giúp bạn phân vùng các hàng dựa trên giá trị được trả về bởi một biểu thức do người dùng xác định.
  • Phân vùng bằng KEY có thể giúp bạn phân vùng các hàng dựa trên hàm băm do MySQL cung cấp.

Phân vùng theo RANGE

Phân vùng bằng RANGE là một trong những hình thức phân vùng bảng MySQL phổ biến nhất. Khi bạn phân vùng bảng theo RANGE, bạn phân vùng bảng theo cách mà mỗi phân vùng chứa một số hàng nhất định nằm trong một phạm vi nhất định. Để xác định một phân vùng, hãy xác định tên của nó, sau đó cho biết nó sẽ giữ những giá trị nào - để phân vùng bảng theo phạm vi, hãy thêm câu lệnh PARTITION BY RANGE. Ví dụ:nếu bạn muốn đặt tên cho phân vùng của mình là p0 và làm cho nó chứa mọi giá trị nhỏ hơn 5, bạn cần đảm bảo rằng truy vấn của bạn chứa các GIÁ TRỊ PHẦN p0 ÍT HƠN (5). Dưới đây là một ví dụ về bảng được phân vùng:

CREATE TABLE sample_table (

id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,

column_name VARCHAR(255) NOT NULL DEFAULT ‘’

...

) PARTITION BY RANGE (column_name) (

PARTITION p0 VALUES LESS THAN (5),

PARTITION p1 VALUES LESS THAN (10),

PARTITION p2 VALUES LESS THAN (15),

PARTITION p3 VALUES LESS THAN (20),

...

);

Bạn cũng có thể xác định một phân vùng chứa tất cả các giá trị không thuộc phạm vi nhất định như sau:

PARTITION p5 VALUES LESS THAN MAXVALUE

Phân vùng trên được đặt tên là p5 và nó chứa tất cả các giá trị mà các phân vùng khác không có - MAXVALUE đại diện cho một giá trị luôn cao hơn giá trị lớn nhất có thể. Bạn cũng có thể sử dụng các hàm bằng cách xác định các phân vùng của mình như sau:

PARTITION BY RANGE (YEAR(date)) (

    PARTITION p0 VALUES LESS THAN (2000),

    PARTITION p1 VALUES LESS THAN (2010),

    PARTITION p2 VALUES LESS THAN (2020),

    PARTITION p3 VALUES LESS THAN MAXVALUE

);

Trong trường hợp này, tất cả các giá trị nhỏ hơn 2000 được lưu trữ trong phân vùng p0, tất cả các giá trị nhỏ hơn 2010 được lưu trữ trong phân vùng p1, tất cả các giá trị nhỏ hơn 2020 được lưu trữ trong phân vùng p2 và tất cả các giá trị không thuộc bất kỳ phạm vi nào trong số này được lưu trữ trong phân vùng p3.

Phân vùng theo LIST

Phân vùng bảng MySQL theo LIST tương tự như phân vùng bằng RANGE - sự khác biệt chính của phân vùng bảng theo LIST là khi các bảng được phân vùng bằng LIST, mỗi phân vùng được xác định và chọn dựa trên thành viên của giá trị cột trong một tập hợp các danh sách giá trị thay vì một phạm vi giá trị. Việc phân vùng theo DANH SÁCH có thể hữu ích khi bạn biết rằng, chẳng hạn như bạn có dữ liệu có thể được chia thành nhiều bộ dữ liệu nhỏ hơn (ví dụ, vùng). Giả sử bạn có một cửa hàng có 4 điểm nhượng quyền:một ở trung tâm thị trấn, thứ hai ở phía bắc, thứ ba ở phía đông, thứ tư ở phía tây. Bạn có thể phân vùng bảng theo cách mà dữ liệu thuộc về một nhượng quyền thương mại nhất định sẽ được lưu trữ trong một phân vùng dành riêng cho nhượng quyền thương mại đó:

PARTITION BY LIST(store) (

PARTITION central VALUES IN (1,3,5),

PARTITION north VALUES IN (2,4,7),

PARTITION east VALUES IN (8,9),

PARTITION west VALUES IN (10,11)

);

Phân vùng bằng HASH

Phân vùng bảng MySQL bằng HASH có thể là một cách để đảm bảo rằng dữ liệu trên các phân vùng được phân phối đồng đều. Nếu bạn đang phân vùng các bảng của mình bằng HASH, bạn chỉ cần chỉ định số lượng phân vùng bạn cần chia dữ liệu của mình thành bao nhiêu - phần còn lại do MySQL xử lý. Bạn có thể sử dụng phân vùng theo HASH bằng cách thêm câu lệnh sau vào TẠO BẢNG:

PARTITION BY HASH(id)

PARTITIONS 5;

Thay 5 bằng số chỉ định thành bao nhiêu phân vùng bạn cần chia dữ liệu của mình thành - số mặc định là 1.

MySQL cũng hỗ trợ phân vùng bằng LINEAR HASH - băm tuyến tính khác với băm thông thường vì băm tuyến tính sử dụng thuật toán lũy thừa tuyến tính của hai. Để phân vùng các bảng theo LINEAR HASH, hãy thay PARTITION BY HASH bằng PARTITION BY LINEAR HASH.

Phân vùng bằng KEY

Phân vùng bảng MySQL bằng KEY tương tự như phân vùng bảng MySQL bằng HASH - trong trường hợp này, hàm băm để phân vùng khóa được cung cấp bởi máy chủ MySQL. Bất kỳ cột nào được sử dụng làm khóa phân vùng phải bao gồm khóa chính của toàn bộ bảng hoặc ít nhất là một phần của khóa chính của bảng. Nếu không có tên cột nào được chỉ định làm khóa phân vùng, thì khóa chính sẽ được sử dụng. Nếu không có khóa chính, nhưng có một khóa duy nhất, thì khóa duy nhất sẽ được sử dụng thay thế. Ví dụ:cả hai câu lệnh sau đều hợp lệ, ngay cả khi câu lệnh đầu tiên thậm chí không chỉ định khóa phân vùng:

CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;

Kết luận

Tóm lại, các phân vùng có thể hữu ích nếu bạn có nhiều dữ liệu, các bảng của bạn quá lớn để vừa trong bộ nhớ hoặc chúng chứa dữ liệu lịch sử. Các phân vùng cũng có thể hữu ích nếu bạn nghĩ rằng bạn sẽ cần phân phối nội dung của bảng trên các phương tiện lưu trữ khác nhau, cũng như nếu bạn muốn có tùy chọn xóa hoặc khôi phục các phân vùng riêng lẻ.

Tuy nhiên, hãy nhớ rằng các phân vùng trong MySQL có những nhược điểm riêng. Một trong những nhược điểm lớn của phân vùng là nó sẽ làm cho các bảng của bạn lớn hơn - bạn không thể đạt được tốc độ mà không ảnh hưởng đến không gian. Nếu bạn có một bộ dữ liệu rất lớn, đây có thể là một vấn đề khá lớn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết hợp sức mạnh của SQL và các câu lệnh thủ tục với Chế độ tương thích Oracle của MariaDB

  2. MariaDB JSON_TABLE () Giải thích

  3. MariaDB GROUP_CONCAT ()

  4. Hỗ trợ cho MariaDB 10.4 trong dbForge Studio được nâng cấp cho MySQL, v.8.1

  5. Khắc phục “ERROR 1054 (42S22):Cột không xác định‘… ’trong‘ on mệnh đề ”trong MariaDB