目录
  1. 1、垂直拆分
    1. 1.1、垂直拆分类别
    2. 1.1.1、垂直分库
    3. 1.1.2、垂直分表
    4. 1.2、垂直拆分的优缺点
  2. 2、水平拆分
    1. 2.1、水平拆分的优缺点
  3. 3、分库分表的思考
  4. 4、我接触到的分库分表例子
  5. 参考
深入了解Mysql【十七】分库分表的简单介绍

当系统用户量上去后,数据库的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

文章作者: ClawHub
文章链接: https://www.clawhub.club/posts/2019/11/21/%E6%B7%B1%E5%85%A5%E4%BA%86%E8%A7%A3Mysql/%E6%B7%B1%E5%85%A5%E4%BA%86%E8%A7%A3Mysql%E3%80%90%E5%8D%81%E4%B8%83%E3%80%91%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8%E7%9A%84%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的博客
打赏
  • 微信
  • 支付宝
扫一扫关注ClawHub公众号,专注Java、技术分享、面试资源。