MongoDB的自增主键 _id 的生成机制

MongoDB的自增主键 _id 的生成机制
如果插入文档时没有 _id 键,系统会自动创建。MongoDB中存储的文档必须有这个“_id”键。这个键的值可以是任意类型,默认是个ObjectId对象,每个文档有唯一的 _id ,确保集合中的每个文档都会被唯一标示。
ObjectId是 _id 的默认类型,不同的机器都能用全局唯一的同种方法方便的生成。因为MongoDB初衷是用作分布式数据库,在多个服务器的分片环境中生成唯一标识符非常重要。
ObjectId使用12字节的存储空间,是一个由24个十六进制数组组成的字符串。

  • 0-3位,共4位,是从标准纪元开始的时间戳,单位为秒。
  • 时间戳与4-8这5位,提供了秒级别的唯一性。
  • 由于时间戳在前,意味着ObjectId大致会按照插入的顺序排列。
  • 隐含了文档创建时间,绝大多数驱动也都会提供一个方法来从ObjectId中获取这个时间
  • 4-6位,共3位,是所在主机的唯一标识符。通常是机器主机名的散列值。这样能确保不同主机生成不同的ObjectId,不产生冲突。
  • 7-8位,共2位,来自产生ObjectId的进程的进程标识符,为了确保在同一台机器上并发的多个进程产生的ObjectId是唯一的。
  • 这样前9个字节就保证了同一秒钟不同机器不同进程产生的ObjectId是唯一的。最后3个字节是一个自动增加的计数器,确保相同进程的同一秒产生的ID也是不同的。一秒钟最多运行每个进程拥有256^3(共16777216)个不同的ObjectId。

另外,_id 主键的生成,可以由MongoDB服务器来做,但通常是由客户端由客户端的驱动程序完成的。这个做法很好的体现了MongoDB的哲学:能交给客户端驱动程序来做的事情就不要交给服务器来做。原因是,即便像MongoDB这样扩展性非常好的数据库,扩展应用层也要比扩展数据库层容易得多。将工作交给客户端来处理,就减轻了数据库扩展的负担。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值