当系统用户量上去后,数据库的IO、连接数以及单机资源成为瓶颈的时候,就要引入分库分表来解决问题了。通过分库分表,将数据切分,使得单一数据库中的数据量变小,从而提升数据库操作性能。
数据切分可以分为垂直拆分和水平拆分,下面简单介绍。

1、垂直拆分

1.1、垂直拆分类别

垂直拆分有两种:垂直分库和垂直分表。

1.1.1、垂直分库

按照现有的系统模块分库,比如用户库、订单库等。有点类似微服务的套路,但是也不能一味的模仿大厂,追求技术。还是要根据具体的业务进行处理,比如有些模块数据量很少,那完全可以将那几个模块连接到一个库中。
垂直分库.png

1.1.2、垂直分表

这种情况是解决表中列过于多的问题,根据业务,根据表中列的相关性拆分成两张表或者多张表。这样虽然会有跨页(B+Tree索引的页存储着一行数据)查询的问题,但是对于热点数据来说,内存中的页所存储的热点数据更多,性能更好。
垂直分表.png

1.2、垂直拆分的优缺点

  • 优点
    通过垂直拆分,系统模块间数据走向清晰、方便扩展、可以适当的减轻单机资源瓶颈问题。

  • 缺点
    分布式事务问题、跨库查询问题、热点数据量大时,单表数据量依然很大。

2、水平拆分

当单表数据量太大时,会出现单库的性能瓶颈,只能根据业务逻辑,将一个表中的数据拆分成多个表,比如按天分表。这个表可以在同一个数据库,也可以在其他的数据库。
水平切分.png
以跨天拆分为例子,这样插入数据,读取单表数据都会对数据库产生很少的压力,当需要多表关联的时候,可以根据业务,通过离线处理或者实时流式处理的方式,将拆分的原始数据处理成想要的数据,放到一张新表中。但是这种拆分要求业务代码相应的修改。
也可以采用中间件来做水平拆分,需要具体分析业务,看研发与运维成本处理。

2.1、水平拆分的优缺点

  • 优点
    单库、单表数据量不会太大,没有高并发瓶颈。
  • 缺点
    与垂直拆分的缺点差不多,无外乎分布式事务问题、跨表跨库查询问题。

3、分库分表的思考

在分库分表解决数据库性能瓶颈的同时,也会带来各种棘手的问题,比如分布式事务、跨分片Join和排序等。
我感觉在系统稳定的前提下,往前看个半年或一年,如果没有特殊要求,能不做分库分表就不做,不要一味的模仿大厂,除非有新的技术能够完美的解决这些问题,否则还是根据系统的业务量,稳稳地相应修改。

4、我接触到的分库分表例子

我所在的项目相对于公司其他项目组是比较老的,但是很稳,初期时所有的数据表都在一个库中.
后来随着数据量增大,几个热点数据表被单独的分配了独立的数据库,这就属于垂直分库;
但是数据量又大的时候,单表内数据也过大,所以将个别的表,根据列拆分成多张表了,这属于垂直分表,在这一时期还将表内的数据,按天水平拆分,有了天明细表,之后通过数据跑批,处理这些天明细表,生成想要的业务数据,这应该属于水平拆分。

参考

数据库分库分表思路
数据库分布式架构扫盲——分库分表(及银行核心系统适用性思考)
分库分表的几种常见形式以及可能遇到的难
水平分库分表的关键步骤以及可能遇到的问题

tencent.jpg