MySQL数据库分库分表的思路以及实现

为什么要分库分表

在业务场景中,mysql的单表数据量出现在千万级左右查询数据就会出现瓶颈。在各种优化后,可以考虑对数据库进行拆分。
1.水平拆分:就是把一张表的数据拆成两张表
水平拆分

2.垂直拆分:将表中的某些字段,单独拆分出来,并通过某个字段和原表建立联系
垂直拆分

分库分表常用思路

1.hash取模方案
hash的方案就是对指定的路由key(通常为主键id)对分表总数进行取模。
优点:某个表不会出现热点问题(某个表被频繁访问,其他表访问较少的情况)
缺点:对于以后要扩容会比较麻烦,增加表的时候要对所有数据重新hash

2.range范围方案
简单来说就是1-1000万的数据放在1数据库并以此类推。
**优点:**有利于将来扩容,有新数据就直接加入就好了
**缺点:**缺点也很明显,有可能出现热点问题。比如刚加进来的数据经常使用之类的问题

3.两者结合的方案
那能不能考虑把两个的有点结合过来,又把去掉两者的缺点?即不容进行数据迁移,又不存在热点问题?其实还有一个现实需求,能否根据服务器的性能以及存储高低,适当均匀调整存储呢?

我们定义一个Group的概念,一个Group包含了一些分库和分表,如下图:
在这里插入图片描述
上图有几个关键点:
一个Group01可以存放4000w个数据,Group01有三个DB,共10table。那么可以通过id范围确定在哪个group,然后id%10哪个db。再根据范围确定哪个table。简单来说就是整体有序,局部用hash打乱,当扩容的时候只要加group就好了。在这里插入图片描述
上图中id一千万以内的都被我们设计的流程均匀的分在了三个的table0中。然后就是为什么对表的总数取模?因为每台服务器的性能有差异,对表取模,那表多的服务器就更能被使用到。在这里插入图片描述
图中我们对10进行取模,如果值为【0,1,2,3】就路由到DB_0,【4,5,6】路由到DB_1,【7,8,9】路由到DB_2。现在小伙伴们有没有理解,这样的设计就可以把多一点的数据放到DB_0中,其他2个DB数据量就可以少一点。DB_0承担了4/10的数据量,DB_1承担了3/10的数据量,DB_2也承担了3/10的数据量。整个Group01承担了【0,4000万】的数据量
其实上面设计思路理解了,扩容就已经出来了;那就是扩容的时候再设计一个group02组,定义好此group的数据范围就ok了。
在这里插入图片描述

使用sharding-sphere实现

SpringBoot整合sharding-sphere实现分库分表

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值