常见的分库分表方式

2017-10-24

这篇文章主要记录了我自己使用过的一些分库、分表、分区表的使用场景和方式。

分库

按时间分库

我们有很多时效性的运营活动,每次节日之类的都会有,复杂一些的活动一般都会有多张独立的表,而这些表在活动期结束后做完数据就基本没有用了。

对于这种场景,为了避免数据库中表的数量过多,影响主体业务,我们采用了按年分库的方式,把对应年费的活动表放到对应年费的库里。

按业务场景分库

前端面向用户的业务数据库一般会做读写分离,因为面向用户的数据库往往读写请求都很多,而面向业务人员的数据相关库则基本为读请求,一般我们也会把业务数据库和离线报表数据库分离开。

分表

按字段 hash、取模 等方式进行分表

这种方式一般适用于总量的增长比较可预估的情况,不会随着业务增长而不断爆发增加的情况,比如目前对于大多数公司来说,用户注册基本关联手机号等实名信息,增长不会过大,但放单表又怕存在性能问题的,即可采取这种方式。

这种场景下分表方案最基本的就是按 id 进行 hash、取模 等,也有更复杂的加入其他字段作为 seed 以便于登录等的方案,具体视实际情况进行选择。

按时间进行分表

这种方式适用于数据随时间不断增长的情况,比如一些用户行为日志等等,大多数情况下可以进行按月分表,每月数据从对应月份的表中进行获取,后台报表等用到的字段计算后放入折叠表这样的方式。

分区表

目前我对分区表的使用比较简单,基本是在一些相对来说重要性不是太高的业务场景下使用的,比如接口调用日志表,按月分区,一定时间之前的分区备份后进行删除,当前表中就一直保持近期的数据即可。