mysql objectid_MongoDB 的objectid和UUID
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相关推荐
- 在MySQL中insert时生成UUID
UUID函数 在MySQL中,可以用uuid()函数来生成一个UUID,如下图: replace函数 默认生成的uuid含有'-',我们可以使用replace函数替换掉'-',SQL如下: selec ...
- MySql为什么不推荐使用UUID做主键
设计MySQL数据库表的时候,一定会考虑主键的设计.mysql官方推荐不要使用uuid或者不连续不重复的雪花id,推荐连续自增的主键id,官方的推荐是auto_increment.为什么不建议采用uu ...
- mysql自增id与uuid的区别
前言 在设计数据库表的时候,MySQL官方推荐不要使用uuid或者不重复不连续的雪花id(long型且id唯一,单机递增),而是腿甲使用自增id,推荐使用auto_increment. 自增id做主键 ...
- mysql objectid_MongoDB ObjectId详解及使用
MongoDB中我们经常会接触到一个自动生成的字段:"_id",类型为ObjectId. 本文详解ObjectId的构成和使用. ObjectId构成 之前我们使用MySQL等关系 ...
- mysql objectid_MongoDB中_id(ObjectId)生成
MongoDB中我们经常会接触到一个自动生成的字段:"_id",类型为ObjectId. 之前我们使用MySQL等关系型数据库时,主键都是设置成自增的.但在分布式环境下,这种方法就 ...
- 克隆后 mysql uuid_mysql主从复制失败(uuid)
我这里用docker镜像生成的两个容器,所以会导致主从复制失败:主从的uuid(UUID 是 通用唯一识别码)相同 . mysql> stop slave; Query OK, 0 rows a ...
- 详解: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 ...
- Mysql 自增id、uuid与雪花id
概念介绍 三种主键 自增id :1 2 3 4 5-- uuid :UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生 ...
- mysql 存储uuid_MySQL中存储UUID的最佳实践
在 MySQL 中有一个UUID () 函数, 通常用UUID做唯一标识,需要在 数据库 中进行存储. 使用此函数可以让MySQL生成一个UUID值,并以VARCHAR(36)类型的可读形式返回.如图 ...
最新文章
- 移动应用开发者应该关注的 Google I/O 两项更新
- android7.1 动态申请权限改为默认授权,修改PackageManagerService.java下的grantPermissions为true
- LinearLayout和RelativeLayoutnbs…
- ANSYS——相同模型不同创建方式的同载荷同约束下的比较
- UNIX(进程间通信):02---父子进程之间的数据共享分析
- 祝贺!两位 Apache Flink PMC 喜提 Apache Member
- cmake编译安装MySQL5.5.32
- 易语言中关于成员变量的声明
- svn 目录结构 trunk java_svn代码版本管理
- OpenCV之感兴趣区域ROI
- 几种常用的排序算法详解和C++排序算法模板(附有动图理解)
- Mysql 实现多种逻辑删除方案
- 到底买苹果XS还是XR_iPhone XS 和 XR 买哪个?10 个理由告诉你 XS 更好,贵是有原因的...
- 近日,软件项目管理高峰论坛成功召开,项目管理平台发布正式亮相……
- Javascript 声明时用“var”跟不用var的区别
- 点击屏幕其他地方让edittext失去焦点 的实现
- 4十4十4写成乘法算式_乘法算式怎么写
- Flink On K8s
- [数据统计]百度在调低索引库的容量
- 免费短信九成暗藏陷阱
热门文章
- C语言之perror()与sterror()用法(十九)
- FFmpeg之yuv镜像(十八)
- C++不能返回string局部引用
- Emacs 下安装 python-mode.el
- ios libfdk-aac encode
- 阿里云服务器如何升级配置和降低配置?
- linux docker端口映射无法访问,docker设置了端口映射,不能访问的解决方案
- nc65 单据非向导开发 源代码_【免费毕设】ASP.NETIT产品网上物流管理信息系统的设计与实现(源代码+论文)...
- Could not find the required component ‘tf2_geometry_msgs‘. The following CMake error indicates that
- 是否允许此网站打开你计算机上的程序