衆所周知,數據分片包括水平和垂直,這裏只討論水平這種情況,並且,我們默認數據的切分規則是以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還能能用的,如果是新項目,能避免還是避免吧。