objectid是12字节组成,四个成分timestamp+machash+pid+inc

默认mongodb collection内的_id是唯一的。客户插入文档时依赖driver自动生成的_id能否保证唯一呢?

自动objectid的唯一性

自动生成并不是mongo daemon生成的,而是driver生成的。

目前没有发现使用服务端生成objectid的,从实验看出mongoshell和javaclient都是客户端生成objectid。后续会发现,同一个客户端进程生成的最后三个byte总是连续的,因为起始的随机值进程启动时就全局确定了,而如果是server端一般服务启动后就长时间运行,server端提供的话多个客户端的objectid可能后缀不是连续的,而事实是连续的。

显然machine name+pid是hash出来的并不能保证objectid唯一,不同的机器的mac地址有可能是相同的,但是可能性比较小;当前进程的id也可能是hash冲突的,可能性也是比较低的;当前进程加载ObjectId的时候给了一个随机值,从这个随机值开始递增计数,随着时间推移,不同进程的递增值发生交叉也是可能的,但是可能性也很低。

如果要发生冲突,那么需要以上四个维度的小概率同时发生,所以但是这个冲突的可能性微乎其微,一般只要按照这个driver的规范使用就可以了。

实际上driver的这种算法可以看作UUID的一种实现,是的多个client在整个时间轴上生成的id总是唯一的。这样服务端不需要维护id如何生成。

当db自动添加objectid入库的时候,如果有已经存在的objectid则会插入失败。一般应用层不用考虑insert时候发生id冲突,由于这个原因导致丢失的document的概率很小。

为什么objectid比递增integer作为id和uuid好?

如果是integer递增势必会影响并发插入,多个客户端无法知道当前最新的id,唯一性都交给服务端保证,只能顺序处理doc insert。生成id的任务多机负载均衡也不灵活,虽然mysql有配置递增步长作为解决方案。objectid由12个字节组成,所有的驱动按照这个规范生成objectid,基本上保证唯一性。

ObjectId可以看作UUID的另一种实现。

mysql objectid_MongoDB 的objectid和UUID相关推荐

  1. 在MySQL中insert时生成UUID

    UUID函数 在MySQL中,可以用uuid()函数来生成一个UUID,如下图: replace函数 默认生成的uuid含有'-',我们可以使用replace函数替换掉'-',SQL如下: selec ...

  2. MySql为什么不推荐使用UUID做主键

    设计MySQL数据库表的时候,一定会考虑主键的设计.mysql官方推荐不要使用uuid或者不连续不重复的雪花id,推荐连续自增的主键id,官方的推荐是auto_increment.为什么不建议采用uu ...

  3. mysql自增id与uuid的区别

    前言 在设计数据库表的时候,MySQL官方推荐不要使用uuid或者不重复不连续的雪花id(long型且id唯一,单机递增),而是腿甲使用自增id,推荐使用auto_increment. 自增id做主键 ...

  4. mysql objectid_MongoDB ObjectId详解及使用

    MongoDB中我们经常会接触到一个自动生成的字段:"_id",类型为ObjectId. 本文详解ObjectId的构成和使用. ObjectId构成 之前我们使用MySQL等关系 ...

  5. mysql objectid_MongoDB中_id(ObjectId)生成

    MongoDB中我们经常会接触到一个自动生成的字段:"_id",类型为ObjectId. 之前我们使用MySQL等关系型数据库时,主键都是设置成自增的.但在分布式环境下,这种方法就 ...

  6. 克隆后 mysql uuid_mysql主从复制失败(uuid)

    我这里用docker镜像生成的两个容器,所以会导致主从复制失败:主从的uuid(UUID 是 通用唯一识别码)相同 . mysql> stop slave; Query OK, 0 rows a ...

  7. 详解:MySQL自增ID与UUID的优缺点及选择建议,MySQL有序uuid与自定义函数实现

    文章目录 1.自增ID的优缺点 1.1 优点 1.2 缺点 1.3 不适合以自增ID主键作为主键的情况 2.UUID作为主键 2.1 介绍 2.2 优点 2.3 缺点 3.有序UUID作为主键 3.1 ...

  8. Mysql 自增id、uuid与雪花id

    概念介绍 三种主键 自增id :1 2 3 4 5-- uuid :UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生 ...

  9. mysql 存储uuid_MySQL中存储UUID的最佳实践

    在 MySQL 中有一个UUID () 函数, 通常用UUID做唯一标识,需要在 数据库 中进行存储. 使用此函数可以让MySQL生成一个UUID值,并以VARCHAR(36)类型的可读形式返回.如图 ...

最新文章

  1. 移动应用开发者应该关注的 Google I/O 两项更新
  2. android7.1 动态申请权限改为默认授权,修改PackageManagerService.java下的grantPermissions为true
  3. LinearLayout和RelativeLayoutnbs…
  4. ANSYS——相同模型不同创建方式的同载荷同约束下的比较
  5. UNIX(进程间通信):02---父子进程之间的数据共享分析
  6. 祝贺!两位 Apache Flink PMC 喜提 Apache Member
  7. cmake编译安装MySQL5.5.32
  8. 易语言中关于成员变量的声明
  9. svn 目录结构 trunk java_svn代码版本管理
  10. OpenCV之感兴趣区域ROI
  11. 几种常用的排序算法详解和C++排序算法模板(附有动图理解)
  12. Mysql 实现多种逻辑删除方案
  13. 到底买苹果XS还是XR_iPhone XS 和 XR 买哪个?10 个理由告诉你 XS 更好,贵是有原因的...
  14. 近日,软件项目管理高峰论坛成功召开,项目管理平台发布正式亮相……
  15. Javascript 声明时用“var”跟不用var的区别
  16. 点击屏幕其他地方让edittext失去焦点 的实现
  17. 4十4十4写成乘法算式_乘法算式怎么写
  18. Flink On K8s
  19. [数据统计]百度在调低索引库的容量
  20. 免费短信九成暗藏陷阱

热门文章

  1. C语言之perror()与sterror()用法(十九)
  2. FFmpeg之yuv镜像(十八)
  3. C++不能返回string局部引用
  4. Emacs 下安装 python-mode.el
  5. ios libfdk-aac encode
  6. 阿里云服务器如何升级配置和降低配置?
  7. linux docker端口映射无法访问,docker设置了端口映射,不能访问的解决方案
  8. nc65 单据非向导开发 源代码_【免费毕设】ASP.NETIT产品网上物流管理信息系统的设计与实现(源代码+论文)...
  9. Could not find the required component ‘tf2_geometry_msgs‘. The following CMake error indicates that
  10. 是否允许此网站打开你计算机上的程序