MySQL - Phân chia theo chiều ngang

Xin chào, các pháp sư cơ sở dữ liệu tương lai! Hôm nay, chúng ta sẽ khám phá thế giới fascininating của MySQL Phân chia theo chiều ngang. Với vai trò là giáo viên máy tính gần gũi với nhiều năm kinh nghiệm, tôi sẽ hướng dẫn bạn trong hành trình này, ngay cả khi bạn chưa từng viết một dòng mã trước đây. Hãy mang theo mũ bảo hiểm ảo của bạn, và chúng ta cùng bắt đầu xây dựng cấu trúc cơ sở dữ liệu!

MySQL - Horizontal Partitioning

MySQL Phân chia theo chiều ngang

Hãy tưởng tượng bạn đang tổ chức một thư viện khổng lồ. Thay vì đặt tất cả sách trên một kệ lớn, bạn quyết định phân chia chúng ra nhiều kệ khác nhau dựa trên một số tiêu chí. Đó chính xác là những gì phân chia theo chiều ngang làm cho cơ sở dữ liệu của bạn!

Phân chia theo chiều ngang, còn được gọi là sharding, là một kỹ thuật chúng ta chia một bảng lớn thành các phần nhỏ hơn, dễ quản lý hơn. Mỗi phần được gọi là một partition, và nó chứa một tập con của các hàng từ bảng gốc.

Hãy bắt đầu với một ví dụ đơn giản:

CREATE TABLE books (
id INT,
title VARCHAR(100),
author VARCHAR(100),
publication_year INT
) PARTITION BY RANGE (publication_year) (
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 ví dụ này, chúng ta đang tạo bảng books và phân chia nó dựa trên publication_year. Chúng ta đã tạo bốn partition:

  • p0: Sách được xuất bản trước năm 2000
  • p1: Sách được xuất bản từ năm 2000 đến 2009
  • p2: Sách được xuất bản từ năm 2010 đến 2019
  • p3: Sách được xuất bản từ năm 2020 trở đi

Bây giờ, khi bạn truy vấn bảng này, MySQL có thể nhanh chóng xác định partition(s) nào để tìm kiếm, làm cho truy vấn của bạn nhanh hơn và hiệu quả hơn.

MySQL Phân chia theo dải

Phân chia theo dải giống như tổ chức tủ quần áo theo mùa. Bạn để tất cả quần áo mùa hè ở một phần, quần áo mùa thu ở phần khác, và vân vân. Trong MySQL, chúng ta sử dụng phương pháp này để phân chia dữ liệu dựa trên các dải giá trị.

Dưới đây là một ví dụ sử dụng lương nhân viên:

CREATE TABLE employees (
id INT,
name VARCHAR(100),
salary INT
) PARTITION BY RANGE (salary) (
PARTITION low_salary VALUES LESS THAN (30000),
PARTITION medium_salary VALUES LESS THAN (60000),
PARTITION high_salary VALUES LESS THAN (100000),
PARTITION very_high_salary VALUES LESS THAN MAXVALUE
);

Trong trường hợp này, chúng ta đang phân chia bảng employees dựa trên các dải lương. Cấu hình này cho phép truy xuất nhanh nhân viên trong các bracket lương cụ thể.

MySQL Phân chia theo danh sách

Phân chia theo danh sách hoàn hảo khi bạn muốn phân chia dựa trên các giá trị cụ thể, thay vì các dải. Đó giống như sắp xếp bộ sưu tập phim của bạn theo thể loại.

Hãy phân chia bảng sản phẩm theo danh mục:

CREATE TABLE products (
id INT,
name VARCHAR(100),
category VARCHAR(50)
) PARTITION BY LIST COLUMNS(category) (
PARTITION p_electronics VALUES IN ('Laptops', 'Smartphones', 'Tablets'),
PARTITION p_clothing VALUES IN ('Shirts', 'Pants', 'Dresses'),
PARTITION p_books VALUES IN ('Fiction', 'Non-fiction', 'Textbooks')
);

Bây giờ, khi bạn truy vấn sản phẩm trong một danh mục cụ thể, MySQL biết chính xác partition nào để tìm kiếm!

MySQL Phân chia theo hash

Phân chia theo hash giống như có một túi lucky dip cho dữ liệu của bạn. MySQL sử dụng hàm hash để xác định row nào nên vào partition nào. Điều này rất tốt cho việc phân phối dữ liệu đều khi bạn không có cách tự nhiên để phân chia theo dải hoặc danh sách.

Dưới đây là một ví dụ:

CREATE TABLE orders (
id INT,
customer_id INT,
order_date DATE
) PARTITION BY HASH(id)
PARTITIONS 4;

Trong trường hợp này, chúng ta đang tạo bốn partition và để MySQL quyết định cách phân phối các row dựa trên cột id.

Phân chia theo khóa

Phân chia theo khóa tương tự như phân chia theo hash, nhưng nó sử dụng hàm hash của MySQL. Nó đặc biệt hữu ích khi bạn muốn phân chia theo khóa chính hoặc khóa duy nhất.

CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
) PARTITION BY KEY()
PARTITIONS 3;

Ở đây, chúng ta đang phân chia bảng customers theo khóa chính id thành ba partition.

MySQL Phân chia con

Phân chia con, hoặc phân chia phức hợp, giống như tạo partition trong partition. Đây là tương đương củaRussian nesting dolls trong cơ sở dữ liệu!

Hãy tạo bảng dữ liệu bán hàng, phân chia theo năm và phân chia con theo quý:

CREATE TABLE sales (
id INT,
sale_date DATE,
amount DECIMAL(10,2)
) PARTITION BY RANGE(YEAR(sale_date))
SUBPARTITION BY HASH(MONTH(sale_date))
SUBPARTITIONS 4 (
PARTITION p0 VALUES LESS THAN (2020),
PARTITION p1 VALUES LESS THAN (2021),
PARTITION p2 VALUES LESS THAN (2022),
PARTITION p3 VALUES LESS THAN MAXVALUE
);

Cấu trúc này cho phép truy vấn cực kỳ nhanh khi bạn đang tìm kiếm dữ liệu bán hàng từ một năm và quý cụ thể.

Bây giờ, hãy tóm tắt các phương pháp phân chia chúng ta đã học trong bảng handy:

Phương pháp Phân chia Use Case Ví dụ
Phân chia theo dải Dữ liệu có dải tự nhiên Lương nhân viên, ngày tháng
Phân chia theo danh sách Dữ liệu có các danh mục离散 Danh mục sản phẩm, khu vực
Phân chia theo hash Phân phối dữ liệu đều ID khách hàng, ID đơn hàng
Phân chia theo khóa Phân chia theo khóa chính hoặc duy nhất Bảng khách hàng theo ID
Phân chia con Tổ chức dữ liệu phức tạp Dữ liệu bán hàng theo năm và quý

Nhớ nhé, các padawan dữ liệu trẻ, phân chia là một công cụ mạnh mẽ, nhưng với quyền lực lớn đi kèm với trách nhiệm lớn. Luôn cân nhắc trường hợp cụ thể và phân phối dữ liệu của bạn trước khi quyết định chiến lược phân chia.

Khi chúng ta kết thúc bài học này, tôi nhớ lại một thời gian tôi làm việc với cơ sở dữ liệu thương mại điện tử lớn. Chúng tôi gặp phải thời gian truy vấn chậm, và giải pháp là thực hiện phân chia theo dải trên bảng sản phẩm dựa trên giá. Đó như một phép thuật - thời gian truy vấn của chúng tôi giảm mạnh, và quản trị viên cơ sở dữ liệu của chúng tôi đã nhảy vui mừng ngay trong phòng máy chủ!

Vậy đừng ngại thử nghiệm với các kỹ thuật phân chia này. Chúng có thể chính là bí quyết để làm cho cơ sở dữ liệu của bạn hát! Đến gặp lại lần sau, hãy tiếp tục lập mã và hy vọng rằng các truy vấn của bạn luôn chạy nhanh!

Credits: Image by storyset