X DevAPI 用户指南  / 第 5 章使用文档  /  5.3 了解文档 ID

5.3 了解文档 ID

本节详细描述了文档 ID 的生成方式以及如何解释它们。X DevAPI 依赖于在 MySQL 8.0.11 版中添加的基于服务器的文档 ID 生成,这会导致所有客户端的文档 ID 顺序增加。InnoDB使用文档 ID 作为主键,从而实现高效的页面拆分和树重组。

本节介绍自动生成的文档 ID 的属性和格式。

文档 ID 属性

文档的_id字段在查询期间的行为方式与文档的任何其他字段相同,除了它的值一旦被插入到集合中就不能更改。该_id字段用作集合的主键。可以通过在插入的文档中手动包含 ID 来覆盖文档 ID 的自动生成。

重要的

X Plugin 不知道插入到集合中的数据,包括您使用的任何手动文档 ID。使用手动文档 ID 时,您必须确保它们不会与服务器可能自动生成的任何 ID 发生冲突(有关详细信息,请参阅文档 ID 生成 ),以避免由于主键重复而导致的任何错误。

只要_id插入的文档中不存在字段值,服务器就会生成一个 _id值。_id用于文档的生成 值作为操作的ResultResult对于连接器/J)对象的 一部分返回给客户端add()。如果您在 InnoDB 集群上使用 X DevAPI,则自动生成 _id的在整个集群中必须是唯一的。通过将 设置为 mysqlx_document_id_unique_prefix 每个集群实例的唯一值,您可以确保文档 ID 在所有实例中都是唯一的。

_id字段必须是顺序的(始终递增)以获得最佳 InnoDB 插入性能(至少在单个服务器内)。值的顺序性质 _id在服务器重新启动时保持不变。

在多主 Group Replication 或 InnoDB Cluster 环境中,_id表的生成值在实例之间是唯一的,以避免主键冲突并最大限度地减少事务认证。

文档 ID 生成

本节介绍文档 ID 的格式。

自动生成的文档ID格式为:

唯一前缀 开始时间戳 连续剧
4字节 8字节 16字节

在哪里:

  • unique_prefix是 InnoDB Cluster 分配给实例的值,用于使文档 ID 在同一集群的所有实例中唯一。的范围unique_prefix是从 0 到 2 16 -1,它是十六进制编码的。默认值为 0,如果它既不是由 InnoDB Cluster 设置的,也不是由 mysqlx_document_id_unique_prefix 系统变量设置的。

  • start_timestamp是服务器实例启动时间的时间戳,16进制编码。在不太可能发生的值 serial溢出的 start_timestamp情况下,将递增 1,serial然后该值从 0 重新开始。

  • serial是每个实例自动递增的整数序列号值,它是十六进制编码的,范围是 0 到 2 64 -1。的初始值 serial设置为 auto_increment_offset 系统变量,值的增量由 auto_increment_increment 系统变量设置。

此文档 ID 格式可确保:

  • 对于源自单个服务器实例的插入,主键值单调递增,尽管值之间的间隔在表中不统一。

  • 使用多主Group Replication或InnoDB Cluster时,不同实例对同一张表的插入不会有冲突的主键值,只要实例 auto_increment_offsetauto_increment_increment 系统变量配置正确(详见变量说明)。