myisam的auto_increment值重启不丢失、truncate归零、允非主键列定义、并发插入可能跳号,且行为与innodb差异显著。

MyISAM表的AUTO_INCREMENT值重启后不丢失
MyISAM引擎会把当前AUTO_INCREMENT值持久化到表的.MYI文件中,所以即使MySQL服务重启,该值也不会重置。比如插入到id=100后删除全部数据,重启后下一条记录仍是id=101。这和InnoDB形成鲜明对比——InnoDB只在内存中维护该值,重启即丢。
TRUNCATE TABLE会让MyISAM的AUTO_INCREMENT归零
TRUNCATE TABLE对MyISAM来说是DDL操作,会重建表结构并重置AUTO_INCREMENT为1;而DELETE FROM table只是DML,不会影响计数器。这点容易混淆:明明没重启、也没改表结构,但TRUNCATE后插入第一条记录又从1开始,不是bug,是MyISAM的设计行为。
MyISAM允许在非主键列上定义AUTO_INCREMENT
只要该列有唯一索引(不一定是主键),MyISAM就允许AUTO_INCREMENT。例如:CREATE TABLE t (id INT UNIQUE, name VARCHAR(10)) ENGINE=MyISAM;再加ALTER TABLE t MODIFY id INT AUTO_INCREMENT;也能生效。InnoDB则严格要求必须是PRIMARY KEY或PRIMARY KEY的一部分。
并发插入时AUTO_INCREMENT可能跳号
MyISAM使用表级锁,但在高并发插入场景下,仍可能出现跳号:多个连接几乎同时请求下一个值,各自缓存了不同批次的ID段(尤其配合auto_increment_increment设置时)。这不是数据错误,而是为避免锁争用做的取舍。如果你依赖连续ID做业务逻辑(比如生成连续订单号),MyISAM不适合这种场景。
真正容易被忽略的是:MyISAM的AUTO_INCREMENT行为高度依赖存储引擎特性,跨引擎迁移表结构时,哪怕SQL语法完全一致,实际表现也可能完全不同。











