插入过程中最大限度地减少autoinc id间隙,如何?

时间:2013-10-27 14:24:32

标签: php mysql

我有一张慢慢收集信息的工作台,比如表A1,A2,A3。

每隔一段时间我就需要将表A1,A2,A3中的新信息复制到表B1,B2,B3中。表格相当大(约20000行)。

A1,A2,A3表使用GUID,而B1,B2,B3表具有AUTO_INCREMENT ID。

由于尺寸大小,插入件的容量为300。

如果其中一个插入失败,那么所有其他表也不能插入数据,因此我将所有查询都放入事务中。

本文中提到的解决方案似乎有效:http://mysql.rjweb.org/doc.php/datawarehouse

除了文章明确提到这不应该在交易中完成(据我所知,这是我无法做到的)

  

此INSERT..SELECT不得在事务内部与其余处理一起完成。否则,您将添加死锁风险,从而导致烧毁ID。

我还考虑过使用INSERT IGNORE和innodb_autoinc_lock_mode = 0,但我无法使用PDO设置innodb_autoinc_lock_mode,它只是给出错误:

  

SQLSTATE [HY000]:常规错误:1238变量'innodb_autoinc_lock_mode'是一个只读变量'

弄清楚如何使用PDO设置innodb_autoinc_lock_mode可以解决这个问题,但我无法做到。

只是做INSERT IGNORE INTO B1 SELECT FROM A1并忽略差距也听起来很诱人,但表格太大而且autoinc id很快达到了大小限制

我一直在努力工作几周,只要他们不快速增加,我就不介意差距。 有没有人建议解决这个问题的最佳方法?

1 个答案:

答案 0 :(得分:2)

  

但是表太大而且autoinc id很快达到了大小限制

不是。

如果您每秒插入一条新记录,将在70年内达到限制。甚至这个限制也可以延长,但有人怀疑是否需要这个限制。

所以,只是不介意差距和插入通常的方式。

而且 - 更多的是 - 不要为自动增量而烦恼。它不是必须保持秩序的东西。