众所周知,数据分片包括水平和垂直,这里只讨论水平这种情况,并且,我们默认数据的切分规则是以ID。
细化下来,其实主要是讨论两种情况:ID为UUID或者说无序的字符串的情况,以及ID是数字形式的情况。前者无序,后者有序。
当ID是无序字符串的时候,一般采用将ID哈希后再取模的形式,而数字则直接取模。从原理上说,前者无法保证数据彻底均匀的分布在各个表中,而后者则没有这种情况。
但,空口无凭,一切还是要以事实为依据,做到心中有数。所以,我创建了10张测试表,准备插入100万条数据,用来探索UUID形式的ID加哈希这种算法的数据分布情况。当然,其实有更简单的方式,直接生成100万个UUID然后哈希取模并计数就行了。不过,我正好测试Sharding JDBC,算是顺势而为吧。
数据如下:
表名 | 数据量 |
t0 | 100032 |
t1 | 100315 |
t2 | 99452 |
t3 | 99762 |
t4 | 100001 |
t5 | 99791 |
t6 | 100614 |
t7 | 100373 |
t8 | 99796 |
t9 | 99864 |
图表来一个:
最大值 | 100614 |
最小值 | 99452 |
差值 | 1162 |
总结:如果是业务限制,UUID还能能用的,如果是新项目,能避免还是避免吧。