字节面试:MySQL自增ID用完会怎样?

数据库 其他数据库
如果表没有设置主键,InnoDB 会自动创建一个全局隐藏的 row_id,其长度为 6 个字节,当 row_id 达到上限后,它的执行流程和主键 ID 不同,它是再次归零,然后重新递增,如果出现相同的 row_id,后面的数据会覆盖之前的数据。

在一些中小型项目开发中,我们通常会使用自增 ID 来作为主键的生成策略,但随着时间的推移,数据库的信息也会越来越多,尤其是使用自增 ID 作为日志表的主键生成策略时,可能很快就会遇到 ID 被用完的情况,那么如果发生了这种情况,MySQL 又会怎样执行呢?

PS:当然,在分库分表的场景中,我们通常会使用雪花算法来替代自增 ID,但中小型项目开发中,使用自增 ID 的场景还是比较多的。

1.自增ID

在 MySQL 中,如果字段的数据类型为整数类型(如 INT、BIGINT 等),则可以通过关键字“AUTO_INCREMENT”来设置让当前的字段实现自增,例如以下 SQL:

CREATE TABLE example_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(128)
);

1.1 优点分析

自增 ID 的优点如下:

  1. 简单方便,能自动为每行数据分配唯一的标识。
  2. 对于按顺序插入的数据,能很好地反映数据插入的先后顺序。

1.2 缺点分析

自增 ID 的缺点如下:

  • 在数据进行迁移或分库分表时,可能会出现问题,需要特殊处理。
  • 如果数据量非常大,可能会达到自增 ID 的上限。
  • 存在安全性问题,比如通过自增 ID 可能会推测出一些业务信息。例如,一个电商订单表使用自增 ID 作为主键,可能会被竞争对手通过订单号大致推测出业务量等信息。

2.自增ID用完会怎样?

自增 ID 分为以下两种情况:

图片图片

一种是主键自增 ID 用完后的情况,另一种是 InnoDB 引擎中未设置主键时使用 row_id 用完后的场景,它们的情况是不一样的,所以我们分开来聊。

2.1 主键自增ID用完

当主键自增 ID 达到上限后,再新增下一条数据时,它的 ID 不会变(还是最大的值),只是此时再添加数据时,因为主键约束的原因,ID 是不允许重复的,所以就会报错提示主键冲突。

我们可以使用以下 SQL 来测试:

CREATE TABLE t (
    id INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(128)
) auto_increment=2147483647;
insert into t(id,`name`) values(null,'javacn.site');
select * from t;
insert into t(id,`name`) values(null,'www.javacn.site');

以上 SQL 是创建了一个表 t,并且给 t 表的主键 id 设置自增 ID,之后再将表的自增 ID 初始化为 INT(有符号)的最大值 2147483647,然后再添加两条数据。

以上 SQL 的执行结果如下:

图片图片

从上面的执行结果可以看出:当主键自增 ID 达到上限后,再新增下一条数据时,它的 ID 不会变(还是最大的值),只是此时再添加数据时,因为主键约束的原因,ID 是不允许重复的,所以就会报错提示主键冲突。

2.2 row_id用完

如果表没有设置主键,InnoDB 会自动创建一个全局隐藏的 row_id,其长度为 6 个字节,当 row_id 达到上限后,它的执行流程和主键 ID 不同,它是再次归零,然后重新递增,如果出现相同的 row_id,后面的数据会覆盖之前的数据。

责任编辑:武晓燕 来源: Java中文社群
相关推荐

2023-10-17 09:41:04

自增主键MySQL

2020-03-28 15:50:18

数据库自增ID维护

2019-09-18 15:49:06

MySQL数据库面试官

2024-07-01 09:00:16

2023-10-24 15:27:33

Mysql自增主键

2018-12-14 15:35:20

MySQL索引数据库

2022-06-24 09:22:15

MySQL自增id

2022-11-08 19:30:52

DjangoID自增

2023-12-26 01:09:28

MySQL存储释放锁

2010-03-29 14:09:12

Oracle ID 自

2022-05-18 09:49:26

MySQLID数据库

2022-02-14 15:03:50

MySQL程序员面试

2022-06-03 08:12:52

InnoDB插入MySQL

2021-05-31 19:50:04

MySQL自增锁InnoDB

2022-08-17 08:17:01

SPI机制接口

2010-04-26 14:03:02

Oracle使用

2011-01-18 09:47:33

自增ID

2010-04-30 12:15:42

Oracle自增ID

2011-08-19 09:45:02

DB4O设置自增ID

2010-07-05 11:26:31

点赞
收藏

51CTO技术栈公众号