问题:
一张表里面有 ID 自增主键,当 insert 了 17 条记录之后, 删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ?引擎中的自增主键会连续吗?讲下原因?(不同的引擎对于自增值的保存策略不同,需要对MySQL的InnoDB、myIsAm两个引擎分别分析)
回答:
- 如果表的类型是InnoDB,那么是15。
因为在MySQL5.7以及之前的版本,InnoDB只是把自增主键的最大ID记录到内存中,并没有持久化到文件里,所以重启数据库会对表进行OPTIMZE优化操作,导致最大ID丢失。重启数据库之后,再次新增记录时,会使用【当前表中最大id值 + 1】作为新插入的id。- 而在 MySQL 8.0版本之后,已经具备了自增值持久化的能力。
- 如果表的类型是MyISAM,那么是18。
因为MyISAM表会把自增主键的最大ID记录到数据文件里,具备自增值持久化的能力,即使重启MySQL自增主键的最大ID也不会丢失。