数据库分库分表

在这里插入图片描述

ShardingSphere

算法刷题专栏 | 面试必备算法 | 面试高频算法
越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
作者简介:硕风和炜,CSDN-Java领域优质创作者,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享
恭喜你发现一枚宝藏博主,赶快收入囊中吧
人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?

ShardingSphere

在这里插入图片描述
在这里插入图片描述

目录

    • 一.分库分表
      • 1.1 什么是分库分表
      • 1.2 分库分表解决的问题
      • 1.3 什么情况下使用分库分表
    • 二.分库分表的方式
      • 2.1 垂直分库
      • 2.2 垂直分表
      • 2.3 水平分库
      • 2.4 水平分表
      • 2.5 总结
        • 2.5.1 垂直拆分
            • 2.5.1.1 垂直拆分带来的提升
            • 2.5.1.2 垂直拆分存在的问题
        • 2.5.2 四种拆分方式总结
    • 三.分库分表的规则
      • 3.1 水平分库规则
      • 3.2 水平分表规则
    • 四.分库分表带来的问题及解决方案
      • 4.1 事务一致性问题
      • 4.2 跨节点关联的问题
      • 4.3 分页排序查询的问题
      • 4.4 主键避重问题
      • 4.5 公共表的问题
    • 五.总结
    • 六.共勉

一.分库分表

在实际开发中,随着数据量的不断增大,单一数据库处理数据的能力会受到限制。如何解决数据量过大的问题,提高系统的性能,分库分表成为了企业面临的一个重要问题。本文将介绍什么是数据库分库分表,为什么需要分库分表,以及如何进行数据库分库分表。

1.1 什么是分库分表

数据库分库分表是通过将原本存储在一张表中的数据进行分拆,分散存储到多个数据库或表中,从而提高系统的数据处理性能。分库分表可以水平扩展数据库的资源,提高数据库的负载能力。

1.2 分库分表解决的问题

传统的关系型数据库在处理海量数据时遇到了诸多挑战,例如性能瓶颈、存储空间浪费、扩展性差、用户请求量大等等问题。

1.3 什么情况下使用分库分表

在项目运行过程中,数据量通常会随着时间的推移而不断增大,单一的数据库在处理超大数据量时会遇到以下问题:

  • 查询速度变慢
  • 写入速度变慢
  • 数据库宕机的可能性增加
  • 数据迁移成本过高
  • 数据扩展能力受限

为了解决上述问题,采用数据库分库分表是一种比较常见的方式。

注意:垂直拆分会在数据库的设计阶段就完成,后续如果需要我们进行优化,我们可以优先选择从SQL优化、索引优化、表字段优化、参数优化、加缓存、最后可以选择水平分库分表的操作。

二.分库分表的方式

2.1 垂直分库

垂直分库指将同一个数据库中的不同表或字段,按照业务逻辑进行分散存储,分散到多个不同数据库中。

例如,在电商平台中,订单表中包含了订单信息和用户信息两个部分,而订单信息和用户信息根据业务逻辑独立存在。在这个情况下,我们可以将订单信息和用户信息分别存储在不同的数据库中,从而大大降低单个数据库的数据量,提高了系统的灵活性和性能。

2.2 垂直分表

垂直分表指的是将同一张表中的不同字段分拆到不同的表中存储的方式。

例如,在用户表中,会存储用户的登录名、密码、昵称、头像等信息,而通常情况下,这些数据在业务逻辑上是没有必然联系的。使用垂直分表的方案,我们可以将用户登录名和密码存储在一个表中,而将用户昵称和头像存储在另一个表中。这样,当需要修改用户姓名或者头像时,只需要修改对应的表,而不需要操作整张用户表,大大提高了处理效率和灵活性。

2.3 水平分库

水平分库指将原本在同一个数据库中的数据平均分配到多个不同数据库上。此方式最主要的作用是提高数据库的扩展性,降低单个节点的压力,增加系统的稳定性和可用性。

举个例子,一个企业的订单系统需要存储 1 亿张订单,每个订单大约需要 1KB 的存储空间,而单个数据库最大可以支持 10TB 的数据,这时候就可以考虑使用水平分库的方式,在 10 个不同的数据库分别存储 1000 万的订单数据。这样,每个数据库存储的数据量就可以在可控范围内,提高了系统的性能和并发处理能力。

2.4 水平分表

水平分表指将原本在一张表中的数据平均分配到多个表内。

对于可能存在数据量特别大的表,运用水平分表的方案能够提高数据处理的速度,将数据分散到不同的表中,每个表的数据量就相对较小,减少了单表数据量过大的风险。例如一家电商企业,所有订单信息都存储在一张表里,而随着订单数据不断增长,单个表的数据量已经开始超过数据库的处理能力限制,此时这家电商企业就可以考虑使用水平分表的方式,在多个表分别存储订单数据。

2.5 总结

2.5.1 垂直拆分

2.5.1.1 垂直拆分带来的提升
  • 解决业务层面的耦合,业务清晰
  • 能对不同业务的数据进行分级管理、维护、监控、扩展等
  • 高并发场景下,垂直分库一定程度的提高访问性能
2.5.1.2 垂直拆分存在的问题

垂直拆分没有彻底解决单表数据量过大的问题

2.5.2 四种拆分方式总结

  • 垂直分库: 根据表的业务不同,分别存放在不同的库中,这些库分别部署在不同的服务器.
  • 垂直分表: 将一个表按照字段分成多表,每个表存储其中一部分字段.
  • 水平分库: 把一张表的数据按照一定规则,分配到不同的数据库,每一个库只有这张表的部分数据.
  • 水平分表: 把一张表的数据按照一定规则,分配到同一个数据库的多张表中,每个表只有这个表的部分数据.

三.分库分表的规则

3.1 水平分库规则

  • 拆分业务库:水平分库的主要目的是将数据库中的数据分散到不同的数据库中,以减轻单个数据库的负担并提高系统的性能和可用性。
  • 定义合适的分片键:水平分库是通过将数据按照某种规则分配到不同的数据库中,从而达到减轻单个数据库的负担的目的。
  • 避免跨分片查询:水平分库是将数据分散到不同的数据库中,每个数据库之间可能会存在一定的网络延迟和通信成本,跨分片查询可能会给系统带来比较大的负担。
  • 不跨库、不跨表,保证同一类的数据都在同一个服务器上面。
  • 数据在切分之前,需要考虑如何高效的进行数据获取,如果每次查询都要跨越多个节点,就需要谨慎使用。

3.2 水平分表规则

  • RANGE:以用户ID为划分依据,将数据水平切分到两个数据库实例,如:1到1000W在一张表,1000W到2000W在一张表,这种情况会出现单表的负载较高

    • 时间:按照年、月、日去切分。
    • 地域:按照省或市去切分。
    • 大小:从0到1000000一个表。
  • HASH

    • 用户ID取模:按照用户ID HASH尽量保证用户数据均衡分到数据库中
  • 各库中表结构必须一样
    在进行水平分库时,需要保证各个库之间表的结构必须一致,这样可以方便进行跨库查询和数据迁移。

  • 不同库不能直接做join操作
    在水平分库的情况下,不同库之间不能直接进行 join 操作,需要通过其他方式进行数据关联。

四.分库分表带来的问题及解决方案

关系型数据库在单机单库的情况下,比较容易出现性能瓶颈问题,分库分表可以有效的解决这方面的问题,但是同时也会产生一些问题:

4.1 事务一致性问题

当我们需要更新的内容同时分布在不同的库时, 不可避免的会产生跨库的事务问题. 原来在一个数据库操作, 本地事务就可以进行控制, 分库之后一个请求可能要访问多个数据库,如何保证事务的一致性,目前还没有简单的解决方案.

4.2 跨节点关联的问题

在分库之后, 原来在一个库中的一些表,被分散到多个库,并且这些数据库可能还不在一台服务器,无法关联查询.解决这种关联查询,需要我们在代码层面进行控制,将关联查询拆开执行,然后再将获取到的结果进行拼装.

4.3 分页排序查询的问题

分库并行查询时,如果用到了分页 每个库返回的结果集本身是无序的, 只有将多个库中的数据先查出来,然后再根据排序字段在内存中进行排序,如果查询结果过大也是十分消耗资源的.

4.4 主键避重问题

在分库分表的环境中,表中的数据存储在不同的数据库, 主键自增无法保证ID不重复, 需要单独设计全局主键.

4.5 公共表的问题

不同的数据库,都需要从公共表中获取数据. 某一个数据库更新看公共表其他数据库的公共表数据需要进行同步.

五.总结

分库分表是一种能够提高数据处理性能和系统扩展能力的有效手段。在实际应用中,我们可以根据业务需求和数据量进行适当的拆分,常见的分库分表方式包括:水平分库、水平分表、垂直分库、垂直分表。在进行分库分表的过程中,需要遵循一些规则:按照业务拆分、同一个业务的数据放在同一个库中、不同业务的数据不能放在同一个库中、存在外键关系的表要在同一个库中、经常连在一起查询的表要在同一个库中、经常分开查询的表可以放在不同的库中、单表数据过大需要考虑水平分表等。通过合理的分库分表规划,可以实现系统的高效稳定运行。

六.共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

你可能感兴趣的:(ShardingSphere,数据库,垂直分库,垂直分表,水平分库,水平分表,mysql,ShardingSphere)