Thời gian đọc: 7 phút
Sharding trong MySQL là một kỹ thuật phân tán dữ liệu, trong đó dữ liệu của một bảng hoặc cơ sở dữ liệu được chia nhỏ thành nhiều mảnh (gọi là shards) và phân tán trên nhiều máy chủ cơ sở dữ liệu khác nhau. Sharding giúp quản lý và xử lý lượng dữ liệu lớn hơn bằng cách chia nhỏ khối lượng công việc và dữ liệu, tăng cường khả năng mở rộng (scalability) và hiệu suất.
Có một số phương pháp phổ biến để phân chia dữ liệu thành các shards:
Giả sử bạn có một bảng users lưu trữ dữ liệu người dùng và hệ thống của bạn đã quá tải vì số lượng bản ghi quá lớn. Bạn có thể áp dụng Range Sharding bằng cách chia nhỏ bảng thành các shards dựa trên cột user_id
. Chúng ta sẽ phân chia bảng users thành 3 shards trên 3 máy chủ khác nhau.
user_id
từ 1 đến 1 triệu.user_id
từ 1 triệu đến 2 triệu.user_id
từ 2 triệu trở lên.Trên Shard 1 (MySQL Server 1):
CREATE DATABASE users_shard1;
USE users_shard1;
CREATE TABLE users (
user_id INT NOT NULL,
username VARCHAR(50),
email VARCHAR(100),
created_at DATE,
PRIMARY KEY (user_id)
);
Trên Shard 2 (MySQL Server 2):
CREATE DATABASE users_shard2;
USE users_shard2;
CREATE TABLE users (
user_id INT NOT NULL,
username VARCHAR(50),
email VARCHAR(100),
created_at DATE,
PRIMARY KEY (user_id)
);
Trên Shard 3 (MySQL Server 3):
CREATE DATABASE users_shard3;
USE users_shard3;
CREATE TABLE users (
user_id INT NOT NULL,
username VARCHAR(50),
email VARCHAR(100),
created_at DATE,
PRIMARY KEY (user_id)
);
Dữ liệu cho Shard 1 (user_id từ 1 đến 1 triệu):
INSERT INTO users (user_id, username, email, created_at)
VALUES (100, 'john_doe', '[email protected]', '2023-08-01');
Dữ liệu cho Shard 2 (user_id từ 1 triệu đến 2 triệu):
INSERT INTO users (user_id, username, email, created_at)
VALUES (1500000, 'jane_doe', '[email protected]', '2023-08-05');
Dữ liệu cho Shard 3 (user_id từ 2 triệu trở lên):
INSERT INTO users (user_id, username, email, created_at)
VALUES (2500000, 'alice_smith', '[email protected]', '2023-08-10');
user_id
.user_id
nhỏ hơn 1 triệu, truy vấn sẽ được gửi đến Shard 1. Nếu user_id
lớn hơn 1 triệu nhưng nhỏ hơn 2 triệu, truy vấn sẽ được gửi đến Shard 2, v.v.Pseudocode trong ứng dụng:
function getDatabaseConnection($user_id) {
if ($user_id < 1000000) {
// Kết nối đến Shard 1
return new PDO('mysql:host=shard1_host;dbname=users_shard1', 'user', 'password');
} elseif ($user_id < 2000000) {
// Kết nối đến Shard 2
return new PDO('mysql:host=shard2_host;dbname=users_shard2', 'user', 'password');
} else {
// Kết nối đến Shard 3
return new PDO('mysql:host=shard3_host;dbname=users_shard3', 'user', 'password');
}
}
$user_id = 1500000;
$pdo = getDatabaseConnection($user_id);
$stmt = $pdo->prepare('SELECT * FROM users WHERE user_id = :user_id');
$stmt->execute(['user_id' => $user_id]);
$user = $stmt->fetch();
print_r($user);
Sharding là một giải pháp mạnh mẽ để mở rộng cơ sở dữ liệu MySQL khi dữ liệu vượt quá khả năng xử lý của một máy chủ đơn lẻ. Dù việc triển khai và quản lý sharding có thể phức tạp, nhưng với lợi ích về khả năng mở rộng và hiệu suất, nó là một phương pháp hữu ích cho các hệ thống lớn.