MySQL 8 和 MySQL 5.7 在自增计数上的区别
MySQL 8 和 MySQL 5.7 在自增计数上的区别
作者:Arunjith Aravindan
本文来源:Percona 博客,爱可生开源社区翻译。
本文约 900 字,预计阅读需要 2 分钟。
Auto-Increment
自增(Auto-Increment)计数功能可以为主键列生成唯一值,这是数据库的一种设计。与 MySQL 5.7 相比,MySQL 8 为自增功能做了一项重要的升级。这个升级可以确保自增计数器的最大值在服务器重启后保持不变,从而为数据一致性和可靠性提供了更好的保障。在本文中,我们将对比 MySQL 5.7 和 MySQL 8 的不同之处,并提供实际示例来展示两者的区别。
MySQL 5.7 的自增
在 MySQL 5.7 中,自动增计数器的工作机制如下:当向包含自增列的表中插入新的一行数据时,计数器会自动加 1,生成的数值会作为插入行的主键使用。这个计数器值仅保存在内存中,在服务器重启后无法持久化。因此,如果服务器崩溃或重启,计数器可能会重置为一个较低的值。
MySQL 8 的自增持久化
随着 MySQL 8 的发布,自增计数器机制有了显著改进。在 MySQL 8 中,自增计数器的最大值现在可以在服务器重启后持久化。这意味着,即使服务器重启,自增计数器也会从上次结束的地方恢复,以确保自增主键的值保持连续。
示例对比
让我们用一个简单的例子来说明 MySQL 5.7 和 MySQL 8 在持久自增计数器方面的区别。我们将创建一个名为 users
的表,用于存储用户信息。
在 MySQL 5.7 中建表。
mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.42-46 | +-----------+ mysql> CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL ); Query OK, 0 rows affected (0.02 sec)
在表中插入三条数据,可以查看到。
mysql> INSERT INTO users (username) VALUES ('user1'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO users (username) VALUES ('user2'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO users (username) VALUES ('user3'); Query OK, 1 row affected (0.01 sec) mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | | 3 | user3 | +----+----------+ 3 rows in set (0.00 sec)
我们继续删除一条记录并插入一条新记录。
mysql> delete from users where id=3; Query OK, 1 row affected (0.01 sec) mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | +----+----------+ 2 rows in set (0.00 sec) mysql> INSERT INTO users (username) VALUES ('user4'); Query OK, 1 row affected (0.01 sec)
删除 ID 为 3 的记录和插入新记录后,与预期一致,我们观察到新记录的 ID 为 4。
mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | | 4 | user4 | +----+----------+ 3 rows in set (0.00 sec)
现在,我们从 users
表中删除最后一条记录(ID=4),重启服务器,并检查表内容。
mysql> delete from users where id=4; Query OK, 1 row affected (0.01 sec) mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | +----+----------+ 2 rows in set (0.00 sec) service mysql restart mysql> select * from users; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 2 Current database: db1 +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | +----+----------+ 2 rows in set (0.01 sec)
表中只剩下两条记录。我们插入第五条记录,判断它是否采用 ID 5,还是回退为ID 3。
mysql> INSERT INTO users (username) VALUES ('user5'); Query OK, 1 row affected (0.00 sec) mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | | 3 | user5 | +----+----------+ 3 rows in set (0.00 sec)
因此,在 MySQL 5.7 中,重启会导致自动增长计数器重置为较低的值,从而使新的记录插入时采用 ID 3。
MySQL 8 的解决方案
MySQL 8 解决了在服务器重启时 InnoDB 存储引擎出现的自增计数器丢失的问题。这项增强可以确保自增计数器的值在服务器重启后持久化,从而保证主键生成的一致性。
在 MySQL 8 中建表。
mysql> select version(); +-------------------------+ | version() | +-------------------------+ | 8.0.33-0ubuntu0.22.04.2 | +-------------------------+ 1 row in set (0.00 sec) mysql> CREATE TABLE users ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> username VARCHAR(50) NOT NULL -> ); Query OK, 0 rows affected (0.04 sec)
在表中插入三条数据,可以查看到。
mysql> INSERT INTO users (username) VALUES ('user1'); Query OK, 1 row affected (0.07 sec) mysql> INSERT INTO users (username) VALUES ('user2'); Query OK, 1 row affected (0.02 sec) mysql> INSERT INTO users (username) VALUES ('user3'); Query OK, 1 row affected (0.01 sec) mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | | 3 | user3 | +----+----------+ 3 rows in set (0.00 sec)
接下来,删除一条并插入一条。
mysql> delete from users where id=3; Query OK, 1 row affected (0.01 sec) mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | +----+----------+ 2 rows in set (0.00 sec) mysql> INSERT INTO users (username) VALUES ('user4'); Query OK, 1 row affected (0.01 sec)
删除 ID 为 3 的记录和插入新记录采用 ID 为 4。
mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | | 4 | user4 | +----+----------+ 3 rows in set (0.00 sec)
删除最后一条记录(ID=4)后,重启服务器并查看表。
mysql> delete from users where id=4; Query OK, 1 row affected (0.01 sec) mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | +----+----------+ 2 rows in set (0.00 sec) service mysql restart mysql> select * from users; ERROR 2013 (HY000): Lost connection to MySQL server during query No connection. Trying to reconnect... Connection id: 8 Current database: db1 +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | +----+----------+ 2 rows in set (0.02 sec)
重启后,users
表中只保留两条记录。在 MySQL 8 中,插入新记录时,如预期那样采用 ID=5。
mysql> INSERT INTO users (username) VALUES ('user5'); Query OK, 1 row affected (0.01 sec) mysql> select * from users; +----+----------+ | id | username | +----+----------+ | 1 | user1 | | 2 | user2 | | 5 | user5 | +----+----------+ 3 rows in set (0.00 sec)
总结
MySQL 8 之前版本中的 InnoDB 存储引擎报告的自增计数器问题可能会导致困惑和数据不一致,特别是在服务器重启期间。计数器的值可能丢失,导致自动生成的主键值不匹配。MySQL 8 通过保证自增计数器在服务器重启之间持久化来解决这个问题。
通过升级到 MySQL 8,开发者可以利用这个功能创建更加坚实的应用程序,可以管理不同的故障情况而不影响数据完整性。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。
SQLE 获取

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OpenHarmony自定义组件介绍
一、创建自定义组件 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。 自定义组件具有以下特点: ● 可组合:允许开发者组合使用系统组件、及其属性和方法。 ● 可重用:自定义组件可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用。 ● 数据驱动UI更新:通过状态变量的改变,来驱动UI的刷新。 以下示例展示了自定义组件的基本用法。 @Component struct HelloComponent { @State message: string = 'Hello, World!'; build() { // HelloComponent自定义组件组合系统组件Row和Text Row() { Text(this.message) .onClick(() => { // 状态变量message的改变驱动UI刷新,UI从'Hel...
- 下一篇
数据采集 ETL & 流批一体化框架 bboss v7.1.0 发布
数据采集 ETL & 流批一体化框架 bboss v7.1.0 发布 ---高效、稳定、快速、安全 bboss--- 简化版 Flink,一个基于开源协议 Apache License 发布的开源项目,由开源团队bboss运维,主要由以下三部分构成: Elasticsearch Highlevel Java Restclient, 一个高性能高兼容性的 Elasticsearch/Opensearch java 客户端框架 数据采集同步 ETL,一个基于 java 语言实现数据采集作业的强大 ETL 工具,提供丰富的输入插件和输出插件,可以基于插件规范轻松扩展新的输入插件和输出插件 流批一体化计算框架,提供灵活的数据指标统计计算流批一体化处理功能的简易框架,可以结合数据采集同步 ETL 工具,实现数据流处理和批处理计算,亦可以独立使用;计算结果可以保存到各种关系数据库、分布式数据仓库 Elasticsearch、Clickhouse 等,特别适用于数据体量和规模不大的企业级数据分析计算场景,具有成本低、见效快、易运维等特点,助力企业降本增效。 项目源码地址参考:源码下载和构建 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19