先说一下业务场景。项目是负责公司短信下发的,目前每日下发量大概在千万级别,采取了每天一张表的分表方案,但为了后续新的发送方接入,需要支持每日近亿级别的发送量,此时每天一张发送日志表的分表方案明显已不再支持。经过激烈讨论,我们引入了mycat的解决方案。
考虑到发送量的大小,我们对发送日志表进行了分库分区操作,保证每一个库和区能够均匀承担数据压力,我们决定对两个字段进行取模。即手机号对200取模决定在哪一个库(分了两百个库,每天一个分区),再传入日期(比如20200127),决定数据落在哪一个分区。
mycat多表查询时会先拿到数据再进行逻辑处理,所以我们设计的时候秉持着尽量分表单表定向查询的原则,把原来一些需要联合查询的字段都放到了rcs_send_log这张分库表中。
partition_name
varchar(12) DEFAULT NULL COMMENT ‘表分区字段-年月日’,
db_split
varchar(20) DEFAULT NULL COMMENT ‘分库字段 (手机号)’
对于知道 partition_name和db_split的增删改查语句,我们能够很快的查询出该记录。但对于批量查询,能避免则避免,无法避免时,通过查询每个库去得到执行结果。
通过在sql语句前加下面这一行,去指定库
/**mycat:dataNode=${dataNodeName}*/
类似这种