分库分表
为什么需要分库分表?
由于业务导致我们的数据量变大,可能是个百万级、千万级的数据,只要影响了我们的业务,就需要对我们的数据库进行改进。
首先需要了解清楚,如果是读的压力太大,我们可以采取读写分离,主从结构。
以某个数据库为master,然后多个slave来缓解读的压力。
如果是读请求也随着变多,一个master顶不住了,可以考虑分库分表。
首先从最简单的分表开始
然后是单个库太大,这时我们要看是因为表多而导致数据多,还是因为单张表里面的数据多。 如果是因为表多而数据多,使用垂直切分,根据业务切分成不同的库。
如果是因为单张表的数据量太大,这时要用水平切分,即把表的数据按某种规则切分成多张表,甚至多个库上的多张表。 分库分表的顺序应该是先垂直分,后水平分。 因为垂直分更简单,更符合我们处理现实世界问题的方式。
垂直分表
将一个具有很多数据的大表,拆分成若干个小表
把里面的不常用的字段、数据大、长度大的字段(比如text类型字段的)拆分成扩展表
垂直分库
垂直分表再怎么分,都是在同一个数据库实例当中,因此单个实例的性能瓶颈是最大的阻碍。
因此我们可以根据业务,拆分到各个数据库,比如订单数据库、用户数据库、库存数据库。
水平分表
将某个大表拆分成若干个小表,里面都有其部分的数据,
可以按照某种规则策略进行拆分
- 哈希拆分
- 范围拆分
水平分库
水平分库是最复杂的一个方法,如果采取了水平分库,虽然能很有效地缓解数据请求的压力,但是也会带来很多问题,不到逼不得已,都不会采取水平分库。
他的代价很高,那为什么还要用它呢?原因是他确实能很明显的提高效率!
水平分库的切分规则
- range(范围拆分):可以从0-10000,10001-20000一个表这样分
- 哈希拆分:比如取一个用户id继续哈希取模,分配到不同的数据库上
- 地域拆分:按照滑动、华南、华北这样的地区来区分业务
- 时间拆分:按照时间维度来进行划分,比如六个月前的放一张表,1年前的放另外一张表,10天内的放一张表这样。这个也是冷热数据分离,将热点数据,和其他不常用的数据分开
分库分表后面临的问题
事务支持
分库之后,引出了分布式事务,无论是面试还是工作中都是比较头疼的问题。由此牵扯出许多问题,比如2TC、3TC、TCC、本地事务表+消息队列等等模型。