随便聊聊分库分表

423 阅读3分钟

分库分表

为什么需要分库分表?

由于业务导致我们的数据量变大,可能是个百万级、千万级的数据,只要影响了我们的业务,就需要对我们的数据库进行改进。

首先需要了解清楚,如果是读的压力太大,我们可以采取读写分离,主从结构。

以某个数据库为master,然后多个slave来缓解读的压力。

如果是读请求也随着变多,一个master顶不住了,可以考虑分库分表。

首先从最简单的分表开始

然后是单个库太大,这时我们要看是因为表多而导致数据多,还是因为单张表里面的数据多。 如果是因为表多而数据多,使用垂直切分,根据业务切分成不同的库。

如果是因为单张表的数据量太大,这时要用水平切分,即把表的数据按某种规则切分成多张表,甚至多个库上的多张表。 分库分表的顺序应该是先垂直分,后水平分。 因为垂直分更简单,更符合我们处理现实世界问题的方式。

垂直分表

image-20211020211744119

将一个具有很多数据的大表,拆分成若干个小表

把里面的不常用的字段、数据大、长度大的字段(比如text类型字段的)拆分成扩展表

垂直分库

垂直分表再怎么分,都是在同一个数据库实例当中,因此单个实例的性能瓶颈是最大的阻碍。

因此我们可以根据业务,拆分到各个数据库,比如订单数据库、用户数据库、库存数据库

image-20211020213017053

水平分表

image-20211020213025468

将某个大表拆分成若干个小表,里面都有其部分的数据,

可以按照某种规则策略进行拆分

  • 哈希拆分
  • 范围拆分

水平分库

水平分库是最复杂的一个方法,如果采取了水平分库,虽然能很有效地缓解数据请求的压力,但是也会带来很多问题,不到逼不得已,都不会采取水平分库。

他的代价很高,那为什么还要用它呢?原因是他确实能很明显的提高效率!

水平分库的切分规则

  • range(范围拆分):可以从0-10000,10001-20000一个表这样分
  • 哈希拆分:比如取一个用户id继续哈希取模,分配到不同的数据库上
  • 地域拆分:按照滑动、华南、华北这样的地区来区分业务
  • 时间拆分:按照时间维度来进行划分,比如六个月前的放一张表,1年前的放另外一张表,10天内的放一张表这样。这个也是冷热数据分离,将热点数据,和其他不常用的数据分开

image-20211020214425973

分库分表后面临的问题

事务支持

分库之后,引出了分布式事务,无论是面试还是工作中都是比较头疼的问题。由此牵扯出许多问题,比如2TC、3TC、TCC、本地事务表+消息队列等等模型。