分库分表

305 阅读2分钟

一、分表

垂直拆分:按功能模块拆分,以解决表与表之间的竞争

水平拆分:将通一个表数据进行拆分保存到不同的数据库中,以解决单表中数据量增长出现压力

水平切分特点:

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.额外的数据管理负担和数据运算压力