【发布时间】:2014-01-19 15:25:35
【问题描述】:
MongodDB中自动生成的ID大小为12 Bytes,大整数的大小为8 bytes。我在 4 台运行 Ubuntu Server 的机器上有一个 mongodb 集群,但我现在只是在测试。插入只能通过一台 nodejs 服务器来完成,但更新和删除可以使用运行在世界各地的本地 c 应用程序的各种机器和 nodejs 服务器来完成。
既然我可以完全控制插入,那么使用自动增量 ID 不是更好吗?
- 在 1MB 内存中,您可以保存 12 个字节 id 中的 87381 个和 8 个字节中的 131027 个 字节 ID。
- 使用自动增量 ID 是否值得,是否有好处 除了节省内存?
- 在性能方面不会比较 8 字节 id 比 12 快 byte id,如果我做索引它不会减小大小吗?
我是怎么做到的:
我有这份文件
{id:0 latestId:174845423}
我很少将其递增 1,我的大多数插入都是批量插入,因此 nodejs 服务器修改要插入的文档循环给每个文档一个递增的 id,在插入操作结束时我添加我更新具有最后一个 id 值的最新 id。
【问题讨论】:
-
您多久生成一次新 ID?意识到 MongoDB 中没有“自动递增字段”类型,因此您需要使用以下模式:docs.mongodb.org/manual/tutorial/…
-
@WiredPrairie 98% 的日常操作都是读取和更新,因为我说过插入只发生在单个 nodejs 服务器上,所以我可以制作一个具有 id 字段的文档,并在插入操作已完成,它们通常是批量插入,因此我可以将 id 添加到要插入的文档中,并在插入结束时,将 id 文档增加插入的文档数,因此插入操作是精心安排的,并且我完全控制它们
-
如果你能保证 Id 是唯一的,并且节点进程永远不会重复一个 Id,你可以使用它。但是,如果节点进程突然死亡......除非您将最后一个值保存在节点进程之外的某个位置,否则您将如何重新开始 ID 生成?
-
@WiredPrairie 我用我当前的方法更新了这个问题,感谢您指向 nodejs 服务器的死部分,但除此之外我还有什么好处吗?
-
这感觉像是过早的优化。内存差异并不显着,比较时间差异是不可测量的(8-12 字节?),并且索引肯定会稍微小一些......但它是否值得真的取决于你。如果您对自己的解决方案感到满意并了解潜在问题,我不建议您改用其他方法。
标签: mongodb