直接执行SHOW VARIABLES LIKE 'innodb_autoinc_lock_mode';即可查看当前值,结果为0(传统)、1(连续)或2(交错);该变量需通过SET GLOBAL或修改my.ini配置并重启MySQL生效,且mode=2要求binlog_format=ROW才安全。

怎么查当前的 innodb_autoinc_lock_mode 值
直接连上 MySQL 执行:SHOW VARIABLES LIKE 'innodb_autoinc_lock_mode'; 就能看到当前值。返回结果通常是 0、1 或 2。注意这个变量是只读的运行时变量,不能用 SET SESSION 修改,必须改配置文件或用 SET GLOBAL(但后者在重启后失效)。
改 my.ini 之前先确认配置文件路径
phpEnv 的 MySQL 配置文件不是标准位置,别直接去 C:\Program Files 下乱找。打开 phpEnv 控制面板 → 点「MySQL」→ 「配置文件」,它会直接打开真实生效的 my.ini(通常在 %PHPEVN_HOME%\MySQL\my.ini)。如果该文件里没有 [mysqld] 段落,就手动加上;如果已有,就在下面追加:
innodb_autoinc_lock_mode = 2 binlog_format = ROW
这两行必须同时存在——innodb_autoinc_lock_mode = 2 要求 binlog_format 是 ROW,否则执行 INSERT ... SELECT 会报错:ERROR 1665 (HY000): Cannot execute statement: binlogging impossible。
改完必须重启 MySQL 服务才生效
仅点击 phpEnv 面板里的「重载配置」或执行 mysqladmin reload 是没用的。必须点「重启 MySQL」,让 mysqld 进程完全重新加载配置。验证方式还是那条命令:SHOW VARIABLES LIKE 'innodb_autoinc_lock_mode';,返回值应为 2,且 SHOW VARIABLES LIKE 'binlog_format'; 应返回 ROW。
mode=2 不等于 ID 不跳,只是跳得更“轻量”
很多人以为设成 2 就能解决自增 ID 不连续问题,其实不是:
-
INSERT INTO t VALUES (),();回滚后,ID 依然空缺——这跟 lock_mode 无关,是 InnoDB 设计使然 -
INSERT INTO t SELECT ...在 mode=2 下分配更松散,跳号频率反而更高,但并发吞吐更好 -
INSERT INTO t (id, name) VALUES (1,'a'), (NULL,'b');这种 mixed insert,只要写了具体 ID,NULL 行仍会申请新值,空缺不可避免
真正影响的是锁行为:mode=2 下没有表级 auto-inc 锁,INSERT ... SELECT 不会阻塞其他普通插入;但如果你用的是主从复制且 binlog_format 是 MIXED 或 STATEMENT,切到 mode=2 可能导致从库数据不一致——这点容易被忽略。


















