什么是数据库分库分表?( 二 )


  • 缺点
将来的数据迁移和扩容 , 会很难 。
如:业务发展很好 , 订单量很大 , 超出了4000万的量 , 那我们就需要增加分表数 。如果我们增加4个表
什么是数据库分库分表?

文章插图
 
一旦我们增加了分表的总数 , 取模的基数就会变成8 , 以前id=12的订单按照此方案就会到4表中查询 , 但之前的此订单时在0表的 , 这样就导致了数据查不到 。就是因为取模的基数产生了变化 。
遇到这个情况 , 我们小伙伴想到的方案就是做数据迁移 , 把之前的4000万数据 , 重新做一个hash方案 , 放到新的规划分表中 。也就是我们要做数据迁移 。这个是很痛苦的事情 。有些小公司可以接受晚上停机迁移 , 但大公司是不允许停机做数据迁移的 。
当然做数据迁移可以结合自己的公司的业务 , 做一个工具进行 , 不过也带来了很多工作量 , 每次扩容都要做数据迁移那有没有不需要做数据迁移的方案呢 , 我们看下面的方案
2.2 range范围方案
range方案也就是以范围进行拆分数据 。
什么是数据库分库分表?

文章插图
 
range方案比较简单 , 就是把一定范围内的订单 , 存放到一个表中;如上图id=12放到0表中 , id=1300万的放到1表中 。设计这个方案时就是前期把表的范围设计好 。通过id进行路由存放 。
  • 优点
我们小伙伴们想一下 , 此方案是不是有利于将来的扩容 , 不需要做数据迁移 。即时再增加4张表 , 之前的4张表的范围不需要改变 , id=12的还是在0表 , id=1300万的还是在1表 , 新增的4张表他们的范围肯定是 大于 4000万之后的范围划分的 。
  • 缺点
有热点问题 , 我们想一下 , 因为id的值会一直递增变大 , 那这段时间的订单是不是会一直在某一张表中 , 如id=1000万 ~ id=2000万之间 , 这段时间产生的订单是不是都会集中到此张表中 , 这个就导致1表过热 , 压力过大 , 而其他的表没有什么压力 。
总结
hash取模方案:没有热点问题 , 但扩容迁移数据痛苦
range方案:不需要迁移数据 , 但有热点问题 。
那有没有一个方案 , 即不需要迁移数据 , 又能解决数据热点的问题呢?




推荐阅读