1、场景
今天看到一个场景,比如一个表,表名字是award_use_risk,作用是记录奖品使用的记录,用作风控。表结构如下:
这个表,只是分库,没有分表,db分成4个库,分别是db0-db4。
我的第一反应是根据terminal no或者prize guid,具体看业务逻辑进行分表操作,这样增加、修改、删除都可以通过分片算法定位到哪个库。
后来看到业务场景里面,需要定时删除前一天的风控数据,这种情况下,条件里面只有时间,没有分片键,如何定位每个库呢?
梳理一下:
- 根据prize guid进行分片路由,比如prize guid%1024/256,结果0-3,正好我们是四个库,没有问题
- 如果删除前一天的所有风控记录,怎么办,这个时候没有prize guid,如何分片?delete from award_use_risk where gmt_create 大约昨天,我们要的就是这个sql语句在每个库执行一遍,不能路由,因为路由不确定哪个库执行,哪个库没有执行。
2、思路
为了确定删除的时候在哪个库,我们不能用prize guid,只能用确定的数字0-3去定位每个库执行一遍,这样我们的分片路由键就必须是一个确定范围的数字,0,1,2,3,称之为data id。