Mysql的分库分表概念简单介绍

142 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

Mysql的分库分表概念简单介绍

1、分表的方式

​ 当数据库数据达到一定程度后,数据库的查询效率会变的非常低,一般可以通过分库分表的方式来解决;

​ 使用分库分表时,主要有垂直拆分和水平拆分两种拆分模式;

垂直拆分:

  • 定义:就是当一张表中有许多字段,可以吧这个大表的字段垂直拆分成两个或者多个表;一般可以把经常使用的字段放在一个表,另外一些使用频率低的存放到另外的表;每张拆分的表的字段数据都只是全部数据的一部分;其中可以使用主键做关联来获得完整信息;
  • 优点:
    • 基于这种垂直拆分可以有很好的扩展性,根据也无需要增加字段;
    • 行数据变小。每次读取从磁盘可以读取更多的数据;
    • 基于数据的访问频率。可以差分成冷热分离的业务模式,提升系统性能;
  • 缺点:
    • 这种拆分方式只是减少了字段的宽度,但是当整体的数据很长的时候,实质上守规矩还是很庞大;
    • 增加分布式事务的处理逻辑;
    • 如果查询的数据设计多个分表,设计join操作。也会降低查询效率;

水平拆分:

  • 定义:又叫横向拆分,他根据数据的行数据来拆分,把一张count很大的表拆分成n张表,每张表存放部分数据,每行记录则存储的是该行的全部记录;可以通过某种规定来实现,比如hash取模等;
  • 优点:
    • 存在单库大数据,高并发的性能瓶颈;
    • 切分的表的结构相同,应用层改造较少,只需要增加路由规则即可;
    • 提高了系统的稳定性和负载能力。
  • 缺点
    • 拆分规则难以抽象; 跨库Join性能较差;
    • 分片事务的一致性难以解决;
    • 数据扩容的难度和维护量极大。
2、主键生成策略
  • UUID:
    • 这种方式在分布式场景下可以作为分库分表的主键id,它不依托数据坤自身的id主键自增,它会生成一列字符串,保证分布式环境下的id唯一,但是通常我们使用Mysql的INNODB存储引擎,它的索引排序依托于自增主键的排序效率会比较高;
  • COMB
    • 就是有序的UUID
  • SNOWFLAKE:
    • 雪花算法
  • Zookeeper分布式id
  • redis分布式id
3、拆分的分片策略

描述:就是如何实现数据库或者表的拆分策略;

  1. 范围分片
    • 就是根据我们自己规定的某个字段按照相应的范围进行分片,例如根据id,或者根据时间范围来分片;
  2. hash取模分
    • 就是比如我们预估数据的数量级,按照预估的最大数据量。来规定一张表最多存放的数据,然后算出需要多少张表,作为取模的被除数,算法实现比较简单,根据散列之计算数据的分布,比较均匀;但是热点数据也分布比较散,不怎么集中,还有就是万一预设值跟实际值大了,那么后期得我扩容也比较麻烦;
  3. 一致性hash
    • 一致性Hash是将数据按照特征值映射到一个首尾相接的Hash环上,同时也将节点(按照IP地址或者机器名Hash)映射到这个环上。对于数据,从数据在环上的位置开始,顺时针找到的第一个节 点即为数据的存储节点。一致性Hash在增加或者删除节点的时候,受到影响的数据是比较有限的,只会影响到Hash环相邻的节 点,不会发生大规模的数据迁移。
  • 扩容:
    • 扩容带来的问题:
      • 数据如何迁移
      • 数据分片规则的额变化问题
    • 一般两种解决方案:
      • 停机扩容
        • 这种方式比较简单粗暴,就是停机扩容,把原有的分片规则重新定义,重新数据同步;
        • 这种方式,即便是出现问题,直接回滚修改配置即可;
        • 比较简单适用于堆高可用不是那么高要求的业务场景;
        • 同时也是它的缺点,不具备高可用,操作失误可能会造成部分数据丢失;
      • 平滑扩容
        • 就是将数据库扩容成原来的两倍
        • 大概步骤:
          • 首先配置成双主模式进行数据同步
          • 数据同步完成不配置双主双写
          • 数据同步完成后,删除双主同步,修改数据库配置

TODO 时间紧急,写的简单,后续再完善把!!!!