自增id 不连续的问题

【 TiDB 使用环境】生产环境
【 TiDB 版本】v7.5.2
业务建表使用的是自增id 做主键(NONCLUSTERED),但是写入的数据id 不是连续的,步长成为了2

Create Table: CREATE TABLE `data_630001t` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `flowid` bigint(20) DEFAULT NULL,
 `dataid` bigint(20) DEFAULT NULL,
 `thirdId` varchar(32) NOT NULL DEFAULT '',
 `title` varchar(100) DEFAULT NULL,
 `content` mediumtext DEFAULT NULL,
 `source` int(11) DEFAULT NULL,
 `url` varchar(128) DEFAULT NULL,
 `deleted` int(11) DEFAULT NULL,
 `ha3Data` mediumtext DEFAULT NULL,
 `ctime` int(11) NOT NULL DEFAULT '0',
 `utime` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`) /*T![clustered_index] NONCLUSTERED */,
 KEY `thirdId` (`thirdId`),
 KEY `idx_deleted` (`deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin


id 不是预期中的1,2,3 而是1,3,5。实际业务中也是规律的步长为2 的id,偶尔会出现一个连续的

但是当把表改成CLUSTERED, 写入的id 就是连续的了,请问以上情况是否符合tidb 自身设计的预期?

是的,分布式特性无法保证 AUTO_INCREMENT 连续自增

它应该是每个tidb-server 预分配一段id, 但是同一个tidb-server 写入的应该是连续的才对吧?

对的,每个节点内部分配到的是连续的

我图中的情况跟你说的不是一个场景,我那个是连接到tidb01 节点上,然后一直insert ,但是id 是呈现了1,3,5 这种,并不是预期中的1,2,3。 但是当我把表改成了 聚簇索引表,插入的id 就是连续了

通过配置AUTO_ID_CACHE = 1 实现了 非聚簇索引的自增id 的连续

Create Table: CREATE TABLE `data_630001t` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `flowid` bigint(20) DEFAULT NULL,
  `dataid` bigint(20) DEFAULT NULL,
  `thirdId` varchar(32) NOT NULL DEFAULT '',
  `title` varchar(100) DEFAULT NULL,
  `content` mediumtext DEFAULT NULL,
  `source` int(11) DEFAULT NULL,
  `url` varchar(128) DEFAULT NULL,
  `deleted` int(11) DEFAULT NULL,
  `ha3Data` mediumtext DEFAULT NULL,
  `ctime` int(11) NOT NULL DEFAULT '0',
  `utime` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`) /*T![clustered_index] NONCLUSTERED */,
  KEY `thirdId` (`thirdId`),
  KEY `idx_deleted` (`deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_id_cache] AUTO_ID_CACHE=1 */

节点不同导致的

分布式可以手动添加参数指定

这个在101课程中有阐述的,由于分布式架构,只能保证在一个tikv节点是连续的。

这与是否CLUSTERED没有联系吧

减小缓存值会增加网路开销

TiDB 的自增 ID (AUTO_INCREMENT ) 只保证自增且唯一,并不保证连续分配。TiDB 目前采用批量分配的方式,所以如果在多台 TiDB server 上同时插入数据,分配的自增 ID 会不连续。当多个线程并发往不同的 TiDB server 插入数据的时候,有可能会出现后插入的数据自增 ID 小的情况。此外,TiDB 允许给整型类型的字段指定 AUTO_INCREMENT,且一个表只允许一个属性为 AUTO_INCREMENT 的字段。

仅能保证递增唯一,不保证连续。

分布式数据库是这样的

你这个id,没必要一定连续吧。就是个主键而已。没什么含义

在mysql中也是没有必要过分关注这个

id肯定是无法连续的哦。

放弃强制自增这种要求吧

分布式主机,能保证递增就很不错了。