问题发现
前几天听朋友描述在删除老数据时,发现自己系统在分库分表的情况下,删除的老数据分布很不均匀,每个库中被删除的数据只会存在几个特定的表中,他们的系统是分为16库,32表,存储时就是常规的先对用户id使用hash函数得到new_id,new_id对16取余,决定先放在哪个库,之后就是new_id对32取余决定放在哪个表,乍一看很正常而且很难发现其中存在的问题。
问题描述
我们来通过举例的方式来看看究竟存在什么问题
new_id: 6 22 38
对于16取余都会得到6
但是对16取余得到6的,对32取余得到
6 22 6
那么到这儿你可能就发现问题了,再举一个
new_id: 7 23 39
对16取余都会得到7
但是对32取余都会得到
7 23 7
所以他们的数据存储发生了严重的倾斜,每个库只有2个表会存在数据
解决思路
首先是要更改划分的方法
1、方法一:可以让new_id直接对16*32取余,得到的结果除32就可以得到位于哪个库,取余32就可以得到位于哪个表
2、方法二:可以让new_id对16取余得到位于哪个库,new_id / 16 % 32 得到位于哪个表
延伸
只要是库与表的个数不互质就都会存在这种分布不均匀的问题