据我所知,对于一个写密集的应用程序,使用ObjectId对于分片密钥来说是一个非常糟糕的主意。 但是,使用Java 中的原生* UUID.randomUUID()作为分片键是一个好主意,因为它们是真正随机的,不会导致单个分片的热点。
这些ID为 128位ID ,如下所示:
它与ObjectId(96bit int)非常相似。
另外,由于必须在_id上有一个索引,因此分片键将是_id,我们将通过为shard_key创建另一个索引来节省RAM。所有东西都可以用于分片。
是针对 Mongod 中的性能问题还是针对磁盘/内存空间问题?
UUID的冲突率为(from wikipedia): 只有在未来100年内每秒生成10亿UUID后,创建一个重复的概率大约为50%。如果地球上每个人拥有6亿UUID,则一次重复的概率约为50%。
答案 0 :(得分:2)
使用UUID会在整个分片中分配您的写入权限,但是您没有查询隔离,因此您的查询结果不会很好。最快的查询是只有一个分片回答的查询。 http://docs.mongodb.org/manual/core/sharding-internals/#sharding-shard-key-query-isolation
这有助于了解您馆藏中的内容,以便更有效地为您提供帮助。
答案 1 :(得分:1)
使用UUID是完全可以的(假设您只是通过其主/分片键查找这些文档)。分片键的目的之一是将相关文档组合在一起。如果我们正在构建,例如flickr,我们的分片键将以user_id
开头,以便用户的照片在一个分片上坐在一起。如果您的文档不相关且主键也是分片键,则没有问题。
答案 2 :(得分:1)
由于https://jira.mongodb.org/browse/JAVA-403,您可能会遇到问题,该问题将在下一版本中修复。