
1) 【一句话结论】:针对百万级用户表,采用“垂直分库+水平分表(哈希+时间维度结合)”策略,通过Seata AT模式分布式事务+异步补偿机制保证数据一致性,结合Redis缓存预热(热点用户预加载+布隆过滤器防穿透),实现读写分离与动态扩容,平衡性能与一致性。
2) 【原理/概念讲解】:分库分表的核心是“拆分数据,提升系统承载能力”。垂直分库是将不同业务表(如用户表、订单表、商品表)按业务模块分散到多个数据库实例,适用于业务表数量多(>100张)、单表数据量大的场景(如电商系统中用户、订单、商品各表独立分库,避免单库因表多或数据量大导致性能瓶颈)。水平分表是将单表按行拆分为多个子表,常用策略有:哈希分表(用户ID哈希取模,均匀分布,适合动态扩容,但可能因新用户集中导致冷热数据不均)、范围分表(按用户ID范围,如0-1M、1M-2M,适合数据增长有规律的场景,扩容需迁移部分数据)、时间分表(按时间维度,如订单表按月分表,适合时间序列数据,查询按时间聚合效率高)。分片键选择需结合业务特征:用户ID哈希可能导致冷热数据分布不均(新用户集中到某分片),因此结合时间维度调整分片键(如用户ID哈希取模+注册时间范围),平衡数据分布与查询效率(例如,用户ID为123456,哈希取模得库索引0,注册时间2023-01则表索引为0,若注册时间2023-07则表索引为6,避免新用户集中到同一分片)。
3) 【对比与适用场景】:
| 策略类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 垂直分库 | 按业务模块将不同表分散到多个数据库 | 单表数据量小,跨库操作复杂(需分布式事务支持) | 业务表数量多(>100张)、数据量大的系统(电商、金融) | 需跨库事务,业务逻辑复杂,跨库查询需路由 |
| 水平分表(哈希) | 用户ID哈希取模,均匀分布 | 动态扩容易,分片数据不均衡(冷热数据) | 用户表、商品表(动态数据,用户/商品增长快) | 分片键固定,扩容需迁移数据,需冷热数据均衡策略 |
| 水平分表(范围) | 按用户ID范围(如0-1M,1M-2M) | 数据增长有规律,扩容需迁移部分数据 | 用户表(按注册时间) | 数据分布不均,扩容复杂,需定期迁移 |
| 水平分表(时间) | 按时间维度(如订单表按月) | 数据按时间增长,查询按时间聚合效率高 | 日志表、订单表(时间序列) | 分片键固定,扩容简单,但查询跨分片聚合需额外处理 |
4) 【示例】:假设数据库为MySQL,业务场景是高并发读低并发写(如用户信息查询频繁)。
5) 【面试口播版答案】:针对百万级用户表,我会采用“垂直分库+水平分表(哈希+时间维度结合)”策略。首先,垂直分库:将用户表、订单表等按业务模块分散到不同数据库,避免单库因表多或数据量大导致性能瓶颈。水平分表:用户表按用户ID哈希取模到10个库,每个库按月分表(如202301-202312),每个库表数据量控制在10万级,平衡数据分布与查询效率。数据一致性方面,采用Seata的AT模式实现分布式事务,通过全局事务协调器管理跨库操作,补偿机制采用异步复制(每分钟校验一次)+定时回滚,确保数据最终一致性。查询性能优化:通过分片路由(根据用户ID计算库表位置)和Redis缓存预热(冷启动时预加载热门用户数据,设置30分钟过期时间,结合布隆过滤器防缓存穿透),减少全表扫描,提升首次查询速度。具体来说,查询时先检查Redis缓存,命中则直接返回,未命中则路由到对应分片读取数据并更新缓存,实现读写分离,提升性能。
6) 【追问清单】:
7) 【常见坑/雷区】: