首页 > 解决方案 > MariaDB - INNODB 在创建增量记录时跳过数字序列 - 为什么?

问题描述

我不知道这是否是预期的行为INNODB,但我真的认为这很奇怪。

如果我使用相同的 SQL 语句 using MYISAM,则行为会按预期发生。

米萨姆

CREATE TABLE main_database.numero (
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id)
) ENGINE = MYISAM DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
INSERT INTO main_database.numero VALUES(NULL); -- First, run once time ...
INSERT INTO main_database.numero SELECT NULL FROM main_database.numero; -- After, more 12 times = 4096 records

结果(预期行为):

在此处输入图像描述

但是,现在如果我使用完全相同的语句,通知引擎是INNODB.

INNODB

CREATE TABLE main_database.numero (
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

INSERT INTO main_database.numero VALUES(NULL); -- First, run once time ...
INSERT INTO main_database.numero SELECT NULL FROM main_database.numero; -- After, more 12 times = 4096 records

结果(奇怪的结果 - 跳过数字序列):

在此处输入图像描述

事实上,这两个引擎都在创建预期的 4096 条记录,但我对 的行为感到担心INNO,因为我正在将我的数据库从 迁移MYISAMINNODB并且我不知道这会对我的应用程序产生多大影响。

标签: mysqlmariadbinnodbmyisam

解决方案


需要 auto_increment 机制来生成唯一值,这些值大于它之前生成的任何值。它不保证生成连续值。

这里有一些讨论:https ://bugs.mysql.com/bug.php?id=57643

忠实地生成连续值并不重要,因为任何值都可能由于其他原因“丢失”:

  • 您的 INSERT 失败,例如因为违反了 UNIQUE KEY 或 FOREIGN KEY 等约束。
  • 您为您的 INSERT 回滚事务。
  • 您成功并提交,但后来该行被您或其他会话删除。

Auto-inc 值不会返回到任何类型的队列,因为其他并发会话可能同时生成了更多的 id 值。InnoDB 维护一个未分配的 id 值池是不值得的,因为该池可能变得巨大且浪费。

此外,“丢失”一个 ID 值可能是合适的,否则有人会认为他们打算删除的行不知何故又回来了。


推荐阅读