MySQL中的表拆分(Sharding)是一种将大型数据表水平分割成多个较小的表的技术。这种技术可以提高查询性能、减轻单个数据库的负载,并增强系统的可扩展性。
以下是一个简单的基于范围的分片示例:
假设我们有一个用户表 users
,包含以下字段:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
created_at TIMESTAMP
);
假设我们按 created_at
字段进行分片,每个月的用户数据存储在一个单独的表中。
CREATE TABLE users_202301 (
id INT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
created_at TIMESTAMP
);
CREATE TABLE users_202302 (
id INT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
created_at TIMESTAMP
);
-- 继续创建其他月份的分片表...
DELIMITER //
CREATE PROCEDURE insert_user(
IN p_id INT,
IN p_name VARCHAR(255),
IN p_email VARCHAR(255),
IN p_created_at TIMESTAMP
)
BEGIN
DECLARE shard_table VARCHAR(255);
SET shard_table = CONCAT('users_', YEAR(p_created_at), LPAD(MONTH(p_created_at), 2, '0'));
SET @sql = CONCAT('INSERT INTO ', shard_table, ' (id, name, email, created_at) VALUES (?, ?, ?, ?)');
PREPARE stmt FROM @sql;
EXECUTE stmt USING p_id, p_name, p_email, p_created_at;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
DELIMITER //
CREATE PROCEDURE get_user_by_id(
IN p_id INT
)
BEGIN
DECLARE shard_table VARCHAR(255);
SET shard_table = CONCAT('users_', YEAR((SELECT created_at FROM users WHERE id = p_id)), LPAD(MONTH((SELECT created_at FROM users WHERE id = p_id)), 2, '0'));
SET @sql = CONCAT('SELECT * FROM ', shard_table, ' WHERE id = ?');
PREPARE stmt FROM @sql;
EXECUTE stmt USING p_id;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云