数据库分库分表

分库分表背景

数据分片: 将存放在单一数据库中的数据,按照某一维度分散地存放至多个数据库或者表中。

​ 达到提升性能瓶颈,以及可用性的效果。

**分库:**分库能够用于有效的分散对数据库单点的访问。

**分表:**分表虽然无法缓解数据库压力,但却能够提供尽量将分布式事务转化为本地事务的可能,一旦涉及跨库的更新操作,分布式事务往往会使问题变复杂。

**多主多从:**使用多主多从的分片方式,可以有效的避免数据单点,从而提升数据架构的可用性。

分库

  • 垂直分库

    在拆分之前,一个数据库是由多个表构成,每个表对应不同业务;拆分之后,会按照业务对数据的需求对数据进行归类,分不到不同的数据库中,从而将压力分散至不同的数据库。

    优点:

    • 可以针对不同业务场景优化数据库,提高性能。
    • 提高了数据库的并发能力。

    缺点:

    • 需要处理分布式事务的问题。
    • 增加了系统的复杂度。
      在这里插入图片描述
  • 水平分库

    相对于垂直分片,它不再将数据根据业务逻辑进行分片,二十通过某个或多个“字段”,根据某种规则将数据分散至多个库或者表中,每个分片仅包含数据的一部分。 例如:根据主键分片,偶数主键的记录放入 0 库(或表),奇数主键的记录放入 1 库(或表)。

    优点:

    • 提高了单库的读写性能,降低了单库数据量。
    • 可以将库存储在不同的物理服务器上,提高了查询效率。

    缺点:

    • 需要处理跨库查询的问题。
    • 对分库规则的设计需要谨慎,避免热点数据集中在某个库中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分表

  • 垂直分表

    同垂直分库的原理,维度变成表。

    优点:

    • 拆分后每个表的数据量变小,查询时涉及的磁盘 I/O 次数相对减少,提高了查询效率。
    • 每个小表的并发写入操作相对较少,减少了数据库锁的竞争,提高了并发能力。

    缺点:

    • 需要在应用层面处理跨表查询的逻辑,增加了开发的复杂性。
    • 如果一个事务涉及多个小表,可能需要在应用层面进行事务管理,增加了代码的复杂性。
    • 需要额外的措施来保证拆分后的小表之间的数据一致性。
  • 水平分表

    同水平分库的原理,维度变成表。

    优点:

    • 可以根据数据量的增长动态地增加分表,从而扩展数据库的存储能力。
    • 每个小表的数据量减少,可以提高查询速度,尤其是在频繁查询的场景下。
    • 拆分后,每个小表的并发写入操作相对减少,降低了数据库锁的竞争,提高了并发性能。

    缺点:

    • 对业务存在一定限制,如果没有按照分片键查询,会造成读扩散问题。

      “读扩散:大部分情况我们都使用主键id作为分片键,理想情况下,我们根据id可以很快的定位该读哪个表,但是多数情况下我们查询的不是主键,而是普通字段,由于不是分片键,我们没办法定位到具体的分表,于是就会对所有分表都执行一次SQL,随着分表越来越多,次数也越来越多,这就是读扩散问题。”

    • 对分表规则的设计需要谨慎,避免热点数据集中在某个表中。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞行模式、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值