【问题标题】:How is the MySQL auto_increment step size determinedMySQL auto_increment 步长如何确定
【发布时间】:2012-01-05 23:10:09
【问题描述】:

我有一个网页表,主键是 URL 的哈希,还有一个 auto_increment ID 列,它也是唯一键。

我有点困惑的是为什么连续插入不会将 ID 字段增加 1。当我第一次创建表并进行单次插入时,第一个 id 是 1。第二个插入产生和 id 5,第三个是 8。

我在表格上有一个触发器,它在插入时计算网页 URL 的哈希值。不确定这是否相关。

有间隙不是问题,但我想了解为什么连续插入不会生成步长为 1 的 ID。

谢谢!

【问题讨论】:

  • 可以贴一下触发器的代码吗?

标签: mysql auto-increment


【解决方案1】:

关于为什么会发生这种情况的几个建议:

auto_increment_increment。这控制每次在 INSERT 期间请求新值时的增量。

此外,如果您在 MySQL 5.1 中使用 InnoDB 表,它们 optimized auto-inc allocation 以便它锁定表的时间更短。这有利于并发,但如果行的 INSERT 与另一个约束(例如辅助 UNIQUE 列或外键)冲突,它也可能“丢失”自动增量值。在这些情况下,分配的 auto-inc 值不会被推回队列,因为我们假设另一个并发线程可能已经分配了下一个 auto-inc 值。

当然也会发生回滚,在这种情况下,可能会分配 auto-inc 值但会被丢弃。

【讨论】:

  • 谢谢比尔。我对它进行了更多尝试,看起来它是导致间隙的重复条目(我的意思是尝试使用重复的主键进行插入)。在重新抓取网页(以更新动态内容)时,这可能会留下很多空白。我想这不是一个大问题,只要我没有用完整数值! :)
  • 今年早些时候,我为一个因此问题而在其 32 位整数主键中的值用完的站点进行了一些咨询。他们有一个辅助 UNIQUE 列,每 1 次成功导致插入失败 1000 次。因此,它们的 auto-inc 值增加了数百,并且它们拥有的行数越多(重复的机会越大)。我们必须 ALTER TABLE 将它们的主键更改为 BIGINT(以及 30 多个依赖表中的外键列)。​​
  • SHOW SESSION VARIABLES; 查看 auto_increment_increment 的当前值
【解决方案2】:

这可能与最终回滚的事务有关。例如,

  1. 插入 google.com id=5
  2. 插入 mysql.com id=6
  3. 插入 stackoverflow.com id = 7
  4. 回滚插入 google.com
  5. 回滚插入mysql.com

然后以 id=7 插入 stackoverflow.com,并将 5 和 6 留空。

【讨论】:

    【解决方案3】:

    自动增量始终以 1 为步长,但一旦删除一行,ID 就不会被释放。

    下一个自动增量 ID 存储在 MySQL 环境中的信息架构数据库中。它始终为 +1,当删除一行时,中间的 ID 将丢失。因此,如果第一个是 1,而第二个(根据您的说法)是 5,则在此过程中已删除了 2,3,4。

    运行此查询以找出并替换 where 中的最后 2 个值;)

    SELECT AUTO_INCREMENT
    from `information_schema`.`TABLES`
    WHERE   TABLE_NAME = '<<YOUR TABLE NAME HERE>>' AND
          TABLE_SCHEMA = '<< YOUR DATABASE NAME HERE >>'
    

    【讨论】:

      【解决方案4】:

      mysql.cnf/ini 可以设置更改:

      auto-increment-increment = 2
      auto-increment-offset = 1
      

      在某些配置中(例如,对于主/主复制),a_i 可以使用这些变量跳过数字。

      【讨论】:

        【解决方案5】:

        SET GLOBAL auto_increment_offset=1;

        SET GLOBAL auto_increment_increment=5;

        auto_increment_offset:连续列值之间的间隔 auto_increment_offset:确定 AUTO_INCREMENT 列值的起点。 默认值为 1。

        more info here

        【讨论】:

          猜你喜欢
          • 2016-07-26
          • 2016-06-14
          • 2015-09-27
          • 2021-12-04
          • 2011-12-17
          • 2017-04-14
          相关资源
          最近更新 更多