数据库-分库分表优化

1、为什么要拆分数据库?

一个数据库的连接数是有上限的,当业务系统变得繁杂时,如果都存储在一个数据库中,那么势必会因为数据库达到瓶颈;此时就需要对数据库中表进行拆分,将其分散到多个数据库中去。

数据库拆分原则:就是指根据系统业务实际情况,将原本放在一个数据库中的数据分散放到多个数据库中去,减少单库的负载。

2、垂直拆分

垂直切分:简单的说就是将数据库中的各个表,依据业务情况将一些表放在一个数据库中,一些表放在另外一个数据库中,
比如商城这些的数据库端按照业务垂直拆分:按照业务订单数据库、用户数据库、商品数据库等进行拆分。

数据库-分库分表优化_第1张图片 

3、水平拆分

水平拆分:简单来说就是将一张表的数据分别存储到多个数据库中,所以一个库中只保存一部分数据;

数据库-分库分表优化_第2张图片 

4、数据库拆分原则

  • 优先考虑使用缓存来降低对数据库的读操作。
  • 再考虑读写分离,降低数据库写操作。
  • 最后开始数据拆分,切分模式: 首先垂直(纵向)拆分、再次水平拆分。
  • 首先考虑按照业务垂直拆分。
  • 再考虑水平拆分:先分库(设置数据路由规则,把数据分配到不同的库中);可以通过mycat来处理
  • 最后再考虑分表,单表拆分到数据1000万以内。

5、切分策略

1. 查询切分

将ID和库的Mapping关系记录在一个单独的库中。

数据库-分库分表优化_第3张图片

优点:ID和库的Mapping算法可以随意更改。
缺点:引入额外的单点。

2. 范围切分

比如按照时间区间或ID区间来切分。

数据库-分库分表优化_第4张图片

优点:单表大小可控,天然水平扩展。
缺点:无法解决集中写入瓶颈的问题。

3. Hash切分

一般采用Mod来切分,下面着重讲一下Mod的策略。

数据库-分库分表优化_第5张图片

数据水平切分后我们希望是一劳永逸或者是易于水平扩展的,所以推荐采用mod 2^n这种一致性Hash。

以统一订单库为例,我们分库分表的方案是32*32的,即通过UserId后四位mod 32分到32个库中,同时再将UserId后四位Div 32 Mod 32将每个库分为32个表,共计分为1024张表。


参考:

数据库水平拆分和垂直拆分 | 起岸星辰

大众点评订单系统分库分表实践 - 美团技术团队

你可能感兴趣的:(数据库,大数据,sql,mysql,数据库)