在 MySQL 中重置 AUTO_INCREMENT 需要很长时间

Posted

技术标签:

【中文标题】在 MySQL 中重置 AUTO_INCREMENT 需要很长时间【英文标题】:Resetting AUTO_INCREMENT is taking a long time in MySQL 【发布时间】:2011-02-10 12:45:40 【问题描述】:
ALTER TABLE tablename AUTO_INCREMENT = 10000000

此查询需要很长时间才能更新。为什么?我需要优化这个查询。

【问题讨论】:

为什么需要这个查询?看起来您的表根本不需要自动增量主键。表结构是什么?这种重置的目的是什么?无论如何,重建索引总是消耗资源的操作。我希望你不是经常需要它 嗨 Sharpnel,非常感谢您的快速回复。在我们的网站上有用户生成的数据和管理员生成的数据。我们也有大量用户.. 在这种情况下,如果管理员需要插入和更新大量数据并且我们不想将 id 与用户数据冲突,那么我们通过重置自动增量来保留 id并在多个表中使用相同的插入和更新。由于我们正在进行批量插入和更新,因此我们将查询写入文本文件并通过命令行进行,希望您理解我的问题。请帮忙 【参考方案1】:

ALTER TABLE 会导致整个表的重建 - 如果您的表包含许多行,这可能需要很长时间。

如果您只需要提高 auto_increment 值的值,最快的方法是插入一个虚拟行(如果需要,然后删除该行)。这只需要几分之一秒,而对于一个大表来说,ALTER TABLE 可能需要几天时间。

例如,假设我有一个带有 auto_increment ID 列和其他列 col1、col2...的表:

insert into autoinc_table set ID = 10000000;
delete from autoinc_table where ID = 10000000;

【讨论】:

这似乎没有解决我的问题,即 int id 字段用完了 id。删除行本身并没有帮助,插入行似乎也不会触发它重置其自动增量值。 这个技巧只有在你想增加自动增量值时才有效。听起来你想减少它。【参考方案2】:

用户和管理员数据不能通过 id 来区分,而是通过另一个字段来区分。 如果您将 id 视为没有其他含义的抽象标识符,它将为您节省大量时间和资源,相信我。

【讨论】:

你的意思是有另一个列,例如user_type,还是有另一个表,里面有一个用户目录? @Pathros 取决于您的需求

以上是关于在 MySQL 中重置 AUTO_INCREMENT 需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

在脚本mysql中重置自动增量列值

mysql数据库密码忘了怎么重置

如何在 MySQL 中重置 AUTO_INCREMENT

如何在 MySQL 中重置 AUTO_INCREMENT

如何在 MySQL 中重置 AUTO_INCREMENT

如何在 MySQL 中重置 AUTO_INCREMENT