我明白,使用寫入沉重的應用程序時,使用ObjectId對於分片鍵來說是一個非常糟糕的主意。 但是,使用來自Java的native * UUID.randomUUID()作爲Shard鍵是否是個好主意,因爲它們確實是隨機的,並且不會導致單個分片的熱點。使用Native Java UUID.getRandom()作爲分片鍵和_id?
這些ID 128位ID,看起來像:
- 5842fa92557947f1b020041ff74868a4
- 308947443e564d80b97dd8411b4b727e
- f8a7ee765bed4ce3bcc5800ac3a2a710
- 1bcfd08b89e94c58ae7695b3e7a1bc4f
它非常類似於的ObjectId (96bit int)。
另外,由於必須在_id上有索引,分片鍵將是_id,我們將通過爲shard_key創建另一個索引來節省RAM。一切收集都將準備好進行分片。
是否適用於Mongod或磁盤/內存空間問題的性能問題?
的UUID的碰撞率(from wikipedia): 只有一點產生十億的UUID每秒未來100年後,創建只有一個重複的概率會約50%。如果地球上的每個人擁有6億個UUID,則一個重複的概率約爲50%。
所以我會更好地碎片,例如,我的帳戶使用_id和每個其他錶鏈接到我的帳戶(如傢俱,權利,訂單)基於新的索引使用AccountId?在AccountId + Furniture._id或者僅在AccountId上分片會更好,假設我將始終提供AccountId。 –