数据库分片:MySQL分库分表实战

发布时间:2026/5/20 0:43:35

数据库分片:MySQL分库分表实战 数据库分片MySQL分库分表实战大家好我是欧阳瑞Rich Own。今天想和大家聊聊数据库分片这个重要话题。作为一个全栈开发者当数据量增长到一定规模时数据库分片是必不可少的优化手段。今天就来分享一下MySQL分库分表的实战经验。为什么需要分片数据增长挑战问题说明单表数据过大查询性能下降单库压力过大无法水平扩展备份恢复困难数据量大导致备份时间长分片策略水平分片 → 按行拆分 垂直分片 → 按列拆分 混合分片 → 结合水平和垂直分片方案1. 按范围分片按时间范围202401, 202402, 202403... 按ID范围1-1000000, 1000001-2000000...2. 按哈希分片user_id % 100 → 0-99个分片 使用一致性哈希3. 按业务分片按地区北京、上海、广州... 按业务线订单、用户、商品...实战案例分表实现-- 创建分片表 CREATE TABLE user_0 ( id BIGINT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100), created_at TIMESTAMP ); CREATE TABLE user_1 ( id BIGINT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100), created_at TIMESTAMP ); -- 分片函数 DELIMITER // CREATE FUNCTION get_user_shard(user_id BIGINT) RETURNS INT DETERMINISTIC BEGIN RETURN user_id % 2; END // DELIMITER ;中间件方案// 使用ShardingSphere const ShardingSphere require(shardingsphere-jdbc); const shardingRule { tables: { user: { actualDataNodes: ds_${0..1}.user_${0..1}, databaseStrategy: { standard: { shardingColumn: id, shardingAlgorithmName: database_inline } }, tableStrategy: { standard: { shardingColumn: id, shardingAlgorithmName: table_inline } } } } };代码层面分片class ShardedUserRepository { constructor() { this.shards [db0, db1, db2, db3]; } getShardIndex(userId) { return userId % this.shards.length; } async getUser(userId) { const shardIndex this.getShardIndex(userId); return this.shards[shardIndex].query(SELECT * FROM user WHERE id ?, [userId]); } async createUser(user) { const shardIndex this.getShardIndex(user.id); return this.shards[shardIndex].query(INSERT INTO user SET ?, user); } }注意事项事务处理跨分片事务 → 使用分布式事务2PC、TCC 尽量避免跨分片操作数据迁移在线迁移 → 使用工具如gh-ost 双写策略 → 同时写入新旧分片扩容问题使用一致性哈希 → 减少数据迁移 预留分片空间 → 避免频繁扩容总结数据库分片是处理大规模数据的有效手段。通过合理的分片策略和中间件支持可以实现数据库的水平扩展。我的鬃狮蜥Hash对分片也有自己的理解——它总是把蟋蟀分成不同区域管理这也许就是自然界的分片策略吧如果你对数据库分片有任何问题欢迎留言交流我是欧阳瑞极客之路永无止境技术栈MySQL · 分库分表 · 数据库优化

相关新闻