卡飞资源网

专业编程技术资源共享平台

JAVA面试|分库分表以及应用场景

一、什么是分库分表?

分库分表是一种数据库拆分技术,目的是解决单库单表数据量过大、访问性能下降的问题。

分库:将数据分散到多个数据库(不同实例)中。

分表:将数据分散到同一个数据库的多个表中。

类似于把一个大仓库(数据库)分成多个小仓库,再把每个小仓库的货架(表)拆分成多个小格子。


二、为什么需要分库分表?

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),避免数据倾斜。

注意事项

分库分表会增加系统复杂度,前期尽量通过索引优化、读写分离、缓存等方式解决问题。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言