gpt4 book ai didi

mysql - MariaDB - INNODB 在创建增量记录时跳过数字序列 - 为什么?

转载 作者:行者123 更新时间:2023-11-29 04:32:48 25 4
gpt4 key购买 nike

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

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

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

结果(预期行为):

enter image description here

现在,如果我使用完全相同的语句,则通知引擎是 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

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

enter image description here

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

最佳答案

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

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

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

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

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

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

关于mysql - MariaDB - INNODB 在创建增量记录时跳过数字序列 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55063401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com