MySQL - Phân chia Vertically

Xin chào, những người đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng khám phá thế giới kỳ diệu của phân chia verticall trong MySQL. Là người giáo viên máy tính gần gũi của bạn, tôi rất vui mừng được hướng dẫn bạn trong hành trình này, ngay cả khi bạn hoàn toàn mới bắt đầu với lập trình. Đừng lo lắng; chúng ta sẽ cùng nhau từng bước, và trước khi bạn nhận ra, bạn sẽ phân chia dữ liệu như một chuyên gia!

MySQL - Vertical Partitioning

Phân chia Vertically trong MySQL

Hãy tưởng tượng bạn có một hộp lớn đồ chơi (đó là cơ sở dữ liệu của chúng ta), và bạn muốn tổ chức chúng tốt hơn. Phân chia verticall giống như sắp xếp đồ chơi của bạn vào những hộp nhỏ hơn dựa trên đặc điểm của chúng. Trong thuật ngữ cơ sở dữ liệu, đó là quá trình chia các cột của một bảng thành các bảng riêng biệt.

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

CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(100),
phone VARCHAR(20),
address TEXT
);

Đây là bảng students gốc của chúng ta. Bây giờ, hãy áp dụng phân chia verticall:

CREATE TABLE students_main (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);

CREATE TABLE students_contact (
id INT PRIMARY KEY,
email VARCHAR(100),
phone VARCHAR(20)
);

CREATE TABLE students_address (
id INT PRIMARY KEY,
address TEXT
);

Tại đây, chúng ta đã chia bảng gốc của mình thành ba bảng nhỏ hơn. Điều này có thể cải thiện hiệu suất, đặc biệt nếu bạn thường xuyên truy cập chỉ một số cột nhất định.

Tại sao sử dụng phân chia verticall?

  1. Cải thiện hiệu suất truy vấn
  2. Quản lý dữ liệu tốt hơn
  3. Tăng cường bảo mật (bạn có thể hạn chế truy cập vào dữ liệu nhạy cảm)

Bây giờ, hãy xem chúng ta có thể chèn và truy xuất dữ liệu như thế nào với cấu trúc mới này:

-- Chèn dữ liệu
INSERT INTO students_main VALUES (1, 'Alice', 20);
INSERT INTO students_contact VALUES (1, '[email protected]', '123-456-7890');
INSERT INTO students_address VALUES (1, '123 Main St, Anytown, USA');

-- Truy xuất dữ liệu
SELECT m.id, m.name, c.email, a.address
FROM students_main m
JOIN students_contact c ON m.id = c.id
JOIN students_address a ON m.id = a.id
WHERE m.id = 1;

Bằng cách này, bạn vẫn có thể lấy được tất cả thông tin về một học sinh, nhưng dữ liệu được lưu trữ một cách hiệu quả hơn.

Phân chia theo Khoảng Cột

Bây giờ, hãy nâng cấp và nói về phân chia theo khoảng cột. Điều này giống như tổ chức sách của bạn theo năm xuất bản, nhưng cho nhiều cột.

Dưới đây là một ví dụ sử dụng bảng sales:

CREATE TABLE sales (
id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10,2) NOT NULL
)
PARTITION BY RANGE COLUMNS(sale_date, amount) (
PARTITION p0 VALUES LESS THAN ('2023-01-01', 1000),
PARTITION p1 VALUES LESS THAN ('2023-01-01', 5000),
PARTITION p2 VALUES LESS THAN ('2023-07-01', 1000),
PARTITION p3 VALUES LESS THAN ('2023-07-01', 5000),
PARTITION p4 VALUES LESS THAN (MAXVALUE, MAXVALUE)
);

Trong ví dụ này, chúng ta đang phân chia dựa trên cả sale_dateamount. Điều này cho phép kiểm soát chi tiết hơn về cách dữ liệu được phân phối.

Hãy chèn một số dữ liệu và xem nó hoạt động như thế nào:

INSERT INTO sales VALUES
(1, '2022-12-15', 500),
(2, '2022-12-20', 2000),
(3, '2023-03-10', 800),
(4, '2023-03-15', 3000),
(5, '2023-08-01', 1500);

-- Hãy kiểm tra partition mà mỗi bản ghi được gán vào
SELECT *, PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'sales';

Truy vấn này sẽ hiển thị partition mà mỗi bản ghi được gán vào dựa trên các tiêu chí khoảng của chúng tôi.

Phân chia theo Danh sách Cột

Cuối cùng, hãy khám phá phân chia theo danh sách cột. Điều này giống như sắp xếp quần áo của bạn theo cả màu sắc và loại - bạn có thể có một ngăn kéo cho áo đỏ, một ngăn kéo khác cho quần xanh, và vân vân.

Dưới đây là một ví dụ sử dụng bảng products:

CREATE TABLE products (
id INT NOT NULL,
name VARCHAR(50),
category VARCHAR(20),
sub_category VARCHAR(20)
)
PARTITION BY LIST COLUMNS(category, sub_category) (
PARTITION p_electronics VALUES IN (('Electronics', 'Phones'), ('Electronics', 'Laptops')),
PARTITION p_clothing VALUES IN (('Clothing', 'Shirts'), ('Clothing', 'Pants')),
PARTITION p_other VALUES IN (('Books', 'Fiction'), ('Books', 'Non-fiction'))
);

Bây giờ, hãy thêm một số sản phẩm:

INSERT INTO products VALUES
(1, 'iPhone 12', 'Electronics', 'Phones'),
(2, 'MacBook Pro', 'Electronics', 'Laptops'),
(3, 'Levi\'s Jeans', 'Clothing', 'Pants'),
(4, 'Harry Potter', 'Books', 'Fiction');

-- Hãy kiểm tra partition mà mỗi sản phẩm được gán vào
SELECT *, PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'products';

Truy vấn này sẽ hiển thị partition mà mỗi sản phẩm được gán vào dựa trên danh sách các tiêu chí của chúng tôi.

So sánh các Phương pháp Phân chia

Phương pháp Use Case Ưu điểm Nhược điểm
Phân chia Verticall Bảng lớn với các cột ít được sử dụng Cải thiện hiệu suất truy vấn, quản lý dữ liệu tốt hơn Các kết nối phức tạp hơn để lấy đầy đủ dữ liệu
Phân chia theo Khoảng Cột Dữ liệu dựa trên thời gian hoặc khoảng số học Hiệu quả cho các truy vấn dựa trên khoảng, tốt cho dữ liệu lịch sử có thể phân phối dữ liệu không đều
Phân chia theo Danh sách Cột Dữ liệu phân loại với nhiều thuộc tính Kiểm soát chính xác việc đặt dữ liệu, tốt cho phân loại phức tạp Có thể trở nên phức tạp với nhiều danh mục

Và đây là tất cả, các bạn! Chúng ta đã cùng nhau hành trình qua thế giới của phân chia verticall trong MySQL, khám phá các miền của phân chia theo khoảng cột, và mạo hiểm vào lãnh thổ của phân chia theo danh sách cột. Nhớ rằng, giống như tổ chức phòng của bạn, chìa khóa của thiết kế cơ sở dữ liệu tốt là đặt mọi thứ vào nơi chúng có ý nghĩa nhất và dễ dàng tìm thấy nhất. Hãy tiếp tục luyện tập, và sớm bạn sẽ trở thành một phù thủy tổ chức cơ sở dữ liệu!

Credits: Image by storyset