数据库水平拆分之ID生成策略

    众所周知,数据分片包括水平和垂直,这里只讨论水平这种情况,并且,我们默认数据的切分规则是以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还能能用的,如果是新项目,能避免还是避免吧。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章