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

2018-01-08 13:34:16来源:网络收集作者:程序诗人人点击

分享

阿里云爆款

如果插入文档时没有 _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这样扩展性非常好的数据库,扩展应用层也要比扩展数据库层容易得多。将工作交给客户端来处理,就减轻了数据库扩展的负担。


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台