一、分表
垂直拆分:按功能模块拆分,以解决表与表之间的竞争
水平拆分:将通一个表数据进行拆分保存到不同的数据库中,以解决单表中数据量增长出现压力
水平切分特点:
1)每个库(表)的结构是一样的
2)每个库(表)的数据都不一样,没有交集
3)所有库(表)的并集是全量数据
垂直拆分特点:
1)每个库(表)的结构都不一样
2)每个库(表)的属性至少有一列交集
3)所有库(表)的并集是全量数据
垂直拆分,常见场景:
1.大字段垂直拆分。单独将大字段建在另外的表中,提高基础表的访问性能,原则上在性能关键的应用中应当避免数据库的大字段。
2.使用用途垂直拆分。按照业务模块拆分。
3.访问频率垂直拆分。可以将基本、使用频繁的属性和不常用的属性垂直拆分开
水平拆分,常见场景:
1.按时间维度进行水平拆分
2.按用户ID属性进行水平拆分
3.按业务进行水平拆分
二、分表、分区
分表就是把一张表分成多个小表,分区则是把一张表分成多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。
分表后,单表的并发能力提高了,磁盘的I/O性能也提高了。分区突破了磁盘I/O瓶颈,以提高磁盘的读写能力,来增加mysql的性能。
分区适用场景:
1.一张表查询速度已经慢到影响使用的时候
2.表中的数据是分段的
3.对数据的操作往往只涉及一部分数据,而不是所有数据
分表适用场景:
1.一张表的查询速度已经慢到影响使用的时候
2.当频繁的插入或者联合查询时,速度变慢
三、分库、分表
分表能够解决单表数据量过大带来的查询效率下降的问题,但无法给数据库的并发能力带来提升。分库,则能提高数据库并发读写能力。
与分表策略相似,分库也可以对关键字取模方式,来对数据访问进行路由。
四、分库分表存在的问题
1.事务管理困难问题
2.跨库跨表join问题
3.额外的数据管理负担和数据运算压力