MySQL 8从零开始学(视频教学版)
上QQ阅读APP看书,第一时间看更新

2.8 MySQL 8.0的新特性2——自增变量的持久化

在MySQL 8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重启后,就会重置AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。

下面通过案例来对比不同的版本中自增变量是否持久化。

在MySQL 5.7版本中,测试步骤如下:

创建的数据表中包含自增主键的id字段,语句如下:

插入4个空值,执行如下:

查询数据表test1中的数据,结果如下:

删除id为4的记录,语句如下:

再次插入一个空值,语句如下:

查询此时数据表test1中的数据,结果如下:

从结果可以看出,虽然删除了id为4的记录,但是再次插入空值时,并没有重用被删除的4,而是分配了5。

删除id为5的记录,结果如下:

重启数据库,重新插入一个空值。

再次查询数据表test1中的数据,结果如下:

从结果可以看出,新插入的0值分配的是4,按照重启前的操作逻辑,此处应该分配6。出现上述结果的主要原因是自增主键没有持久化。

在MySQL 5.7中,对于自增主键的分配规则是由InnoDB数据字典内部一个计数器来决定的,而该计数器只在内存中维护,并不会持久化到磁盘中。当数据库重启时,该计数器会通过下面这种方式初始化。

     SELECT MAX(ai_col) FROM table_name FOR UPDATE;

在MySQL 8.0版本中,上述测试步骤的最后一步,结果如下:

从结果可以看出,自增变量已经持久化了。