我已经研究过这个话题,但仍无法得出确凿的答案。 我想知道天气最好将mongodb _id(BsonObj)替换为Auto Inc intger
由于我已阅读here,因此将_id替换为auto inc int不是最佳做法
Generally in MongoDB, you would not use an auto-increment pattern for the _id field, or any field, because it does not scale for databases
我使用_id -> {redis.incr("my_id")}
它有效,但我想知道: 1.为什么mongo首先使用Bsson,为什么他们没有内置功能将其替换为auto inc? 2.对于auto inc integer,是否存在高比例的基准?
答案 0 :(得分:3)
就像他们在文章中所说的那样,使用自动增量键对数据库的可扩展性不是很好。
可以提到以下几点:
自动增量键倾向于在索引数据结构(例如btree)中的同一页面或块中本地化最近插入的行/文档。插入数据的许多连接都可能产生争用。甚至支持行级锁定的非常可扩展的数据库(例如Oracle)也不能免于此问题。这一点并不真正适用于MongoDB,因为锁定粒度更糟糕(数据库锁定)。
单调序列可以触发涉及昂贵的索引重新平衡的数据管理模式。它取决于btree实现,但是在另一端删除时插入btree的一端会导致btree不平衡。
在基于范围分区的分布式系统中(例如使用自动分片功能时的MongoDB),自动增量键倾向于为最近插入的文档本地化同一节点上的活动。工作负载将应用于一个特定分片,而不是分布在所有分片上。它将在集群中创建一个热点。
基准测试通常无用,因为它们不适用于您的工作负载。您可以构建自己的基准测试,如果您想看到使用单调序列作为主键的负面影响,请务必使用许多并行连接来插入数据。
请注意,在您的示例中,Redis和MongoDB都倾向于序列化工作负载,因为Redis是单线程的,如果MongoDB流量本地化在单个节点上,您将在数据库锁上发生争用。
如果您仍想使用自动增量键,请务必避免对此键进行分片,或使用hashed shard key。