MySQL 8.0特性-自增变量的持久化
https://www.518cn.com 发布时间:2025-03-18 22:32 作者:网络
摘要:MySQL 8.0特性-自增变量的持久化 在MySQL 8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key) 1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key) 1,这种现象在某些情况下会导致业务主键
MySQL 8.0特性-自增变量的持久化
在MySQL 8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key) 1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key) 1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。 下面通过案例来对比不同的版本中自增变量是否持久化。
MySQL5.7测试
在MySQL 5.7版本中,测试步骤如下: 创建的数据表中包含自增主键的id字段,语句如下:
CREATE TABLE test1(
id INT PRIMARY KEY AUTO_INCREMENT
);
-- 插入4个空值,执行如下:
INSERT INTO test1
VALUES(0),(0),(0),(0);
-- 查询数据表test1中的数据,结果如下:
mysql> SELECT * FROM test1;
----
| id |
----
| 1 |
| 2 |
| 3 |
| 4 |
----
4 rows in set (0.00 sec)
-- 删除id为4的记录,语句如下:
DELETE FROM test1 WHERE id = 4;
-- 再次插入一个空值,语句如下:
INSERT INTO test1 VALUES(0);
-- 查询此时数据表test1中的数据,结果如下:
mysql> SELECT * FROM test1;
----
| id |
----
| 1 |
| 2 |
| 3 |
| 5 |
----
4 rows in set (0.00 sec)
-- 从结果可以看出,虽然删除了id为4的记录,但是再次插入空值时,并没有重用被删除的4,而是分配了5。
-- 删除id为5的记录
DELETE FROM test1 where id=5;
重启数据库
service mysql stop
service mysql start
继续插入空值,然后再次查询数据表test1中的数据,结果如下:
mysql> INSERT INTO test1 values(0);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
----
| id |
----
| 1 |
| 2 |
| 3 |
| 4 |
----
4 rows in set (0.00 sec)
从结果可以看出,新插入的0值分配的是4,按照重启前的操作逻辑,此处应该分配6。出现上述结果的主要原因是自增主键没有持久化。 在MySQL 5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典内部一个 计数器 来决定的,而该计数器只在 内存中维护 ,并不会持久化到磁盘中。当数据库重启时,该计数器会被初始化。
MySQL 8.0测试
上述测试步骤最后一步的结果如下:
mysql> select * from test1;
----
| id |
----
| 1 |
| 2 |
| 3 |
| 6 |
----
4 rows in set (0.00 sec)
从结果可以看出,自增变量已经持久化了。
MySQL 8.0将自增主键的计数器持久化到 重做日志
中。每次计数器发生改变,都会将其写入重做日志中。如果数据库重启,InnoDB会根据重做日志中的信息来初始化计数器的内存值。
相关文章
- 优化GreatSQL日志文件空间占用 GreatSQL对于日志文件磁盘空间占用,做了一些优化,对于binlog、...03-18
- "数据约束条件" date: 2022-11-24T21:24:31 08:00 draft: false MySQL字段约束条件 无符号, 零填充...03-18
【GreatSQL优化器-16】INDEX_SKIP_SCAN
【GreatSQL优化器-16】INDEX_SKIP_SCAN 一、INDEX_SKIP_SCAN介绍 GreatSQL 优化器的索引跳跃扫描(Index Ski...03-18- MySQL 是一个非常流行的开源关系数据库管理系统,在各种应用场景中都得到了广泛的应用。随...03-18
- 🤖 DB-GPT 是一个开源的 AI 原生数据应用程序开发框架,具有 AWEL(代理工作流表达式语...03-18
GreatSQL 8.0.32-27 GA (2025-3-10)
GreatSQL 8.0.32-27 GA (2025-3-10) 版本信息 发布时间:2025年3月10日 版本号:8.0.32-27, Revision aa66a38591...03-18- 6. MySQL 索引的数据结构(详细说明) @目录6. MySQL 索引的数据结构(详细说明)1. 为什么使用索引2...03-18
- @Override @Transactional(rollbackFor = Exception.class) public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyDa...03-18
- 个人Qt项目总结——数据库查询断言问题 问题: 当我使用MySQL数据库的查询操作时, 如果查询...03-18
- MySQL 是一种广泛使用的关系数据库管理系统,MySQL 8 是其最新的主要版本,结合了出色的性能和...03-18
最新评论