作者 | 老顾聊技术
链接 | www.toutiao.com/i6677459303055491597
中大型项目中,一旦遇到数据量比较大,小伙伴应该都知道就应该对数据进行拆分了 。有垂直和水平两种 。
垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库 。如下图,独立的拆分出订单库和用户库 。
![分库分表这样玩,可以永不迁移数据、避免热点](http://img.jiangsulong.com/220408/2249452a8-0.jpg)
文章插图
水平拆分的概念,是同一个业务数据量大之后,进行水平拆分 。
![分库分表这样玩,可以永不迁移数据、避免热点](http://img.jiangsulong.com/220408/2249453b5-1.jpg)
文章插图
上图中订单数据达到了4000万,我们也知道MySQL单表存储量推荐是百万级,如果不进行处理,mysql单表数据太大,会导致性能变慢 。使用方案可以参考数据进行水平拆分 。把4000万数据拆分4张表或者更多 。当然也可以分库,再分表;把压力从数据库层级分开 。
Tips:欢迎关注微信公众号:JAVA后端,每日技术博文推送 。
分库分表方案
分库分表方案中有常用的方案,hash取模和range范围方案;分库分表方案最主要就是路由算法,把路由的key按照指定的算法进行路由存放 。下边来介绍一下两个方案的特点 。
1、hash取模方案
![分库分表这样玩,可以永不迁移数据、避免热点](http://img.jiangsulong.com/220408/2249454949-2.jpg)
文章插图
在我们设计系统之前,可以先预估一下大概这几年的订单量,如:4000万 。每张表我们可以容纳1000万,也我们可以设计4张表进行存储 。
那具体如何路由存储的呢?hash的方案就是对指定的路由key(如:id)对分表总数进行取模,上图中,id=12的订单,对4进行取模,也就是会得到0,那此订单会放到0表中 。id=13的订单,取模得到为1,就会放到1表中 。为什么对4取模,是因为分表总数是4 。
- 优点:
热点的含义:热点的意思就是对订单进行操作集中到1个表中,其他表的操作很少 。
订单有个特点就是时间属性,一般用户操作订单数据,都会集中到这段时间产生的订单 。如果这段时间产生的订单 都在同一张订单表中,那就会形成热点,那张表的压力会比较大 。
- 缺点:
如:业务发展很好,订单量很大,超出了4000万的量,那我们就需要增加分表数 。如果我们增加4个表
![分库分表这样玩,可以永不迁移数据、避免热点](http://img.jiangsulong.com/220408/2249452591-3.jpg)
文章插图
一旦我们增加了分表的总数,取模的基数就会变成8,以前id=12的订单按照此方案就会到4表中查询,但之前的此订单时在0表的,这样就导致了数据查不到 。就是因为取模的基数产生了变化 。遇到这个情况,我们小伙伴想到的方案就是做数据迁移,把之前的4000万数据,重新做一个hash方案,放到新的规划分表中 。也就是我们要做数据迁移 。这个是很痛苦的事情 。有些小公司可以接受晚上停机迁移,但大公司是不允许停机做数据迁移的 。
当然做数据迁移可以结合自己的公司的业务,做一个工具进行,不过也带来了很多工作量,每次扩容都要做数据迁移那有没有不需要做数据迁移的方案呢,我们看下面的方案
2、range范围方案range方案也就是以范围进行拆分数据 。
![分库分表这样玩,可以永不迁移数据、避免热点](http://img.jiangsulong.com/220408/224945F10-4.jpg)
文章插图
range方案比较简单,就是把一定范围内的订单,存放到一个表中;如上图id=12放到0表中,id=1300万的放到1表中 。设计这个方案时就是前期把表的范围设计好 。通过id进行路由存放 。
- 优点
- 缺点
3、总结:hash取模方案:没有热点问题,但扩容迁移数据痛苦
推荐阅读
- 祛除体内湿气多吃姜 这样吃效果更佳
- 冬天晒太阳有讲究 这样晒可远离癌症
- 佳能喷墨打印机报错不能用?看到这些代码这样做立马解决
- 蛇胆川贝液
- 红酒别再直接喝了,学会这样做,入秋后露一手,家人朋友都爱喝
- “毁肾”的三大饮水习惯,不要这样喝水了
- 仰卧起坐减腰吗
- 跑步怎么瘦腿
- 分布式数据层 解决问题 分库分表 读写分离
- 恋茶首次推出面向80后茶饮产品