如何能够减少数据库自增id的跳变情况?

我目前使用数据库,在没有切主的情况下,发现数据表的自增id出现了跳变情况。请问一下应该怎么排查是什么导致的跳变情况,以及怎么能够避免这种情况啊?

2 个赞

看看官网描述:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001431031

自增列的跳变

在 MySQL 数据库中,自增列是数据库表中的一种列属性,它可以自动生成一个唯一的、递增的值,用于表示该行数据的唯一标识。OceanBase 数据库作为分布式数据库,其数据库表通常分布在多台不同的机器上,在尽可能与 MySQL 数据库兼容的同时还需要保证分布式多机场景下自增列生成的性能,从而会出现自增值生成过程中的跳变问题。

在 OceanBase 数据库中,自增列支持两种自增模式,即 NOORDER 模式和 ORDER 模式,默认为 ORDER 模式。其中:

  • ORDER 模式:基于集中缓存的自增列。设置为该模式后,自增列的值全局递增。
  • NOORDER 模式:基于分布式缓存的自增列,设置为该模式后,仅保证自增列的值全局唯一。

NOORDER 模式

场景 1:多机多分区生成自增值
场景 2:通过 INSERT 语句插入指定的最大值
场景 3:机器重启或宕机

ORDER 模式

场景 1:机器重启或宕机
场景 2:切主

如果要保持递增,那就用order模式。如果还不想中间跳跃,是不是只能auto_increment_cache_size=1了,这样的话性能会收到很大的影响。除非是一些基础资料表,数据量很少的情况。

1 个赞

可以参考下这个帖子

oceanbase数据库自增id会突然从 个位数 直接变成 六位数13lmw8l_gaMTIwMjU5NTAzNC4xNzE0OTc1MTY1_ga_T35KTM57DZ*MTcyODUzODUwNC4yNDguMS4xNzI4NTUxMjMyLjQ0LjAuMA…

跳变就是因为请求发送到不同节点了,楼上的人提到了order 和 noorder模式之间的区别,想要不跳变的话用order模式能实现但是性能不能保证