慢auto_increment重置

And*_*lov 5 mysql innodb auto-increment

我有很多表,由于某些原因,我需要在应用程序启动时调整此表的自动增量值.

我试着这样做:

mysql> select max(id) from item;
+----------+
| max(id)  |
+----------+
| 97972232 |
+----------+
1 row in set (0.05 sec)

mysql> alter table item auto_increment=1097972232;
Run Code Online (Sandbox Code Playgroud)

在另一场会议中:

afrolov@A1-DB1:~$ mysql -u root -e "show processlist" | grep auto_increment
472196  root    localhost       test    Query   39      copy to tmp table       alter table item auto_increment=1097972232
Run Code Online (Sandbox Code Playgroud)

MySQL正在开始重建表!为什么MySQL需要这样做?如何在调整auto_increment值时避免重建大表?

MySQL 5.0,InnoDB.
表定义:

 CREATE TABLE `item` (
      `id` bigint(20) NOT NULL auto_increment,
      `item_res_id` int(11) NOT NULL default '0',
      `stack_count` int(11) NOT NULL default '0',
      `position` int(11) NOT NULL default '0',
      `place` varchar(15) NOT NULL default '',
      `counter` int(11) NOT NULL default '-1',
      `is_bound` tinyint(4) NOT NULL default '0',
      `remove_time` bigint(20) NOT NULL default '-1',
      `rune_res_id` int(11) default NULL,
      `rune_id` bigint(20) default NULL,
      `avatar_id` bigint(20) NOT NULL,
      `rune_slot_res_id` int(11) default NULL,
      `is_cursed` tinyint(4) NOT NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `avatar_id` (`avatar_id`,`place`,`position`),
      UNIQUE KEY `rune_id` (`rune_id`),
      KEY `idx_item_res_id` (`item_res_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=97972233 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

关于我为什么要这样做.长话短说我想解决关于在服务器重启时重置auto_increment值的mysql innodb问题.有时我们将行中的行复制到另一个表中,并且我们必须保持行ID不变.当我们向table1添加一行(例如id = 1)时,将行复制到table2,从table1中删除行并重新启动MySQL,然后当我们在table1中创建一个新行时,此行也将获得id = 1.因此,如果我们必须将行复制到table2,我们会遇到唯一的约束违规.我们已经有很多代码,很难重写它们.调整自动增量值似乎是解决此问题的最简单方法.

添加:

MySQL 5.5 - 完全相同:(

ajr*_*eal 13

只需添加一个auto_increment_id-1对每个表都有所需的临时记录,然后删除记录,快速简便,但可能太脏了

例:

insert into item set id=1097972232-1;

执行后,下一个auto_increment将是1097972232,这是你想要的

这可以避免缓慢


der*_*ert 6

这是MySQL记录的"功能":

如果对RENAME以外的ALTER TABLE使用任何选项,MySQL总是会创建一个临时表,即使数据不需要严格复制(例如更改列的名称时).对于MyISAM表,您可以通过将myisam_sort_buffer_size系统变量设置为较高值来加快索引重新创建操作(这是更改过程中最慢的部分).

http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

MySQL 5.1和5.5支持一些临时表的更改表操作,但更改auto_increment没有记录为其中之一.

无论如何,为什么需要更改auto_increment值?这不是你应该经常做的事情.