一、什么是分库分表?
分库分表是一种数据库拆分技术,目的是解决单库单表数据量过大、访问性能下降的问题。
分库:将数据分散到多个数据库(不同实例)中。
分表:将数据分散到同一个数据库的多个表中。
类似于把一个大仓库(数据库)分成多个小仓库,再把每个小仓库的货架(表)拆分成多个小格子。
二、为什么需要分库分表?
1. 单表数据量过大
比如:订单表有10亿条数据,查询速度变慢,索引效率下降。
2. 高并发读写
比如:每秒10万次请求,单库扛不住,导致连接数耗尽。
3. 硬件瓶颈
单机磁盘、CPU、内存资源有限,无法支撑海量数据。
三、分库分表的类型
1. 垂直拆分
垂直分库:按业务拆分不同数据库。例如:用户库、订单库、商品库。
垂直分表:按字段拆分同一数据库的不同表。例如:将用户表拆分为 user_base(基础信息)和 user_detail(详细信息)。
2. 水平拆分
水平分库:将同一表的数据按规则分散到多个库。例如:用户表按user_id % 3分散到3个库。
水平分表:将同一表的数据按规则分散到多个表。例如:订单表按月份拆分,每月一张表order_202501,order_202502。
四、典型应用场景
1. 电商系统
订单表:按user_id分库,避免单个用户订单集中在同一表。
商品表:按category_id分库,不同类目商品分散存储。
2. 社交平台
用户动态表:按user_id分表,用户只能看到自己的动态。
消息表:按receiver_id分库,保证用户查询消息时的性能。
3. 日志系统
操作日志表:按create_time分表(如按月拆分),方便按时间范围查询。
五、分库分表的挑战
1. 跨库查询困难
例如:查询“用户最近 3 个月的所有订单”,需跨多个库和表查询。
解决方案:使用冗余字段或异步聚合。
2. 全局唯一ID生成
分库分表后,数据库自增ID不可用。
解决方案:雪花算法(Snowflake)、UUID、Redis 自增。
3. 事务一致性
跨库事务需使用分布式事务(如Seata)。
4. 扩容问题
增加分片数量时,数据迁移成本高。
解决方案:提前规划分片数量,使用一致性哈希。
六、总结
何时用分库分表?
单表数据超千万、高并发导致性能瓶颈时。
如何选择分片键?
选择高频查询的字段(如 user_id),避免数据倾斜。
注意事项
分库分表会增加系统复杂度,前期尽量通过索引优化、读写分离、缓存等方式解决问题。