众所周知,当业务量达到一定程度时,单库单表已经无法hold住压力,这个时候往往需要根据业务进行分库分表。
分表类型
- 垂直拆分 即大表拆小表,将不经常使用或者长度较大的字段拆分出去放到“副表”中
- 水平拆分 即横向分表,将表中不同的数据行按照一定规律分布到不同的数据库表中
分表规则
通常根据主键或者业务id等字段进行hash和取模,得到相应的db和table,当然也可以将id和库的Mapping关系记录在一个单独的库中,优点是Mapping算法可以随意更改, 缺点是引入额外的单点。此外,还有根据时间维度进行分表的。
分库分表意义
分库通常是避免资源竞争,不同的库部署在不同的数据库实例上,某种程度上也可以缓解主从同步延迟,一般一个实例是一个IO线程进行binlog同步,如果只有一个库那么binlog量过大IO线程压力也会增大,从而影响主从同步。 分表通常是减少表容量,提升查询速度,单表500w到1000w数据量数据库性能往往比较可观。
分库分表带来的问题
- 跨库join的问题
- 跨库事务(分布式事务)的问题