SHOW VARIABLES LIKE 'innodb_autoinc_lock_mode';
SET GLOBAL innodb_autoinc_lock_mode = 2;
SHOW VARIABLES LIKE 'binlog_format';

insert ... select 批量灌数据时,其他会话的 insert 全部停在 waiting for autoinc lock,单条插入从 2 毫秒涨到 300 毫秒。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,自增锁模式为 1 时,批量插入要拿表级自增锁直到语句结束,保证自增值连续。其他插入只能排队等这把锁。并发插入越多,排队越明显。

「自增锁等待」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

处理上按这个顺序:确认当前自增锁模式;binlog 是 row 格式就可以放到 2 交错分配 不再排队;主从要求语句一致就保留 1 把批量插入放到低峰;观察调整后单条插入的耗时变化。

改完只确认一件事:批量灌数时其他 insert 不再出现 autoinc 等待 单条插入耗时回到毫秒级。

作者 9823189