MOngDb 主键id生成原理

MongDb存储的文档必须有一个"_id"键(主键)文档的唯一标识

  • 插入文档不存在该键时 会自动创建 可以服务器来做 但通常交由客户端驱动程序完成 原因如下:
    • 虽ObjectId易生成 但是生成则会产生开销
    • MongDb的设计理念是 能从服务器端转移到驱动的 就尽量转移 因为可扩展式数据库 扩展应用层要比扩展数据库容易的多 将事务交由客户端来处理 就减轻了数据库扩展的负担

类型

  • 可以是任何类型 默认是ObjectId对象

ObjectId

  • 轻量型 不同机器可用全局唯一的同种方法生成 MongDb设计上就是做分布式数据库 处理多个节点是核心要求 所以采用ObjectId 替代常规自增主键这种(需要多个服务器 同步自动增加主键) 要更加省时省力
  • 存储空间--12字节:每个字节是两位十六进制数字 所以是一个24位的字符串(ObjectId表示的大小 其实是实际可存储数据的两倍长 所以每次创建其实只有几位数字的变化)
  • 创建方式--12字节创建方式如下
    • 时间戳
      • 标准纪元开始 单位--秒 4个字节 与随后5个字节结合 确认秒级别唯一性
      • "大致"有序 因为时间戳在前 所以ObjectId大致会按照插入顺序排列 (基于这点 设为索引可提高效率) 【注】不是百分百有序
    • 机器
      • 主机唯一标识符 3个字节 一般是主机名的散列值 【保证不同机器ObjectId唯一】
    • PId
      • 进程标识符 2个字节 【保证同台机器不同进程ObjectId唯一】
    • 计数器
      • 自动增加计数器 3个字节 【保证同台机器、同一进程、同一秒产生的ObjectId唯一】 同一秒最多容许同一进程拥有256^3(16 777 216)个不同的ObjectId
posted @ 2023-02-28 10:17  C余L小R鱼  阅读(58)  评论(0编辑  收藏  举报