主题切换
分库分表
一、分库分表的时机
- 业务数据量激增:单表数据量达到1000万或数据文件超过20G。
- 常规优化失效:主从读写分离、索引优化等方式已无法解决性能问题。
- 系统出现瓶颈:磁盘IO、网络IO或CPU瓶颈(如聚合查询慢、连接数过多)。
二、拆分策略
1. 垂直拆分
- 垂直分库:按业务模块将不同表拆分到不同数据库,如用户、订单、商品表分库。
- 特点:按业务分级管理,提高高并发下的磁盘IO和连接数。
- 垂直分表:按字段属性拆分,如将不常用字段、text/blob大字段单独成表。
- 特点:冷热数据分离,减少IO争抢。
2. 水平拆分
- 水平分库:将一个库的数据拆分到多个库,按ID取模、范围路由等规则分发数据。
- 特点:解决单库大数据量和高并发瓶颈,提升系统稳定性。
- 水平分表:将一个表的数据拆分到多个表(可在同一库内),按ID取模分发数据。
- 特点:优化单表数据量过大的性能问题,减少锁表几率。
三、核心问题与中间件
1. 分库后的问题
- 分布式事务一致性问题
- 跨节点关联查询、分页排序问题
- 主键避重问题
2. 分库分表中间件
- ShardingSphere:主流分库分表中间件,支持多种拆分策略
- MyCat:开源数据库中间件,实现分库分表与读写分离
面试相关问题
问:你们项目用过分库分表吗?答: 用过。当时项目订单业务单表数据量超过1000万,主从和索引优化已无法支撑,采用了水平分库+分表的方案,用ShardingSphere实现,按订单ID取模拆分到多个库表,解决了高并发和大数据量的性能瓶颈。
问:分库分表的拆分策略有哪些?答: 分为垂直拆分和水平拆分。垂直拆分包括按业务分库和按字段分表;水平拆分包括按ID取模、范围路由等分库分表,具体根据业务场景选择。
问:分库分表会带来什么新问题?怎么解决?答: 会带来分布式事务、跨节点关联查询、主键避重等问题。通常用分布式事务框架解决一致性问题,通过中间件实现跨节点路由,用雪花算法等方式生成全局唯一主键。