注:本文讨论的是基于Innodb存储引擎。
1.为什么MySQL建议将自增列id设置为字段?
总结一下:当我们使用自增列作为字段时,访问效率是最高的。
2、自增列ID必须连续吗?
自动递增的 id 是递减的php自增,并且不一定是连续的。
我们首先看一下MySQL对于自增值的保存策略:
InnoDB引擎的自增值实际上是存储在显存中的,MySQL 8.0版本之后才具备了“自增持久化”的能力,也就是说“如果发生重启,自增值会自动保存在显存中”。可以将表的值恢复为“MySQL重启前的值”,具体情况是:
在MySQL 5.7及更早版本中,自增值存储在显存中,并不持久化。 每次重启后,第一次打开表时,会找到最大自增值max(id),然后将max(id)+1作为表当前的自增值。
例如表当前数据行最大id为10,则AUTO_INCRMENT=11。 此时我们删除了id=10的行,AUTO_INCRMENT仍然是11。但是如果立即重启实例php自增,那么重启后这张表的AUTO_INCRMENT就会变成10。
换句话说,重新启动 MySQL 可能会更改表的 AUTO_INCRMENT 值。
在MySQL 8.0版本中,自增值的变化记录在重做日志中。 重启时,可以利用重做日志来恢复重启前的值。
导致自增ID不连续的情况可能包括:
3、自增ID有上限吗?
自增id是一个整数数组。 我们经常使用int类型来定义降序的id。 int类型是有上限的,即降序的id也有上限。
下表列出了以下 int 和 bigint 字段类型的范围:
类型
尺寸
范围(有符号)
范围(无符号)
整数
4字节
(-2147483648,2147483647)
(0,4294967295)
大整数
8字节
(-9223372036854775808,9223372036854775807)
(0,18446744073709551615)
从上表可以看出:当自增数组使用int有符号类型时,最大可以达到2147483647,即超过21亿; 当使用int unsigned类型时,最大可以达到4294967295,即超过42亿。 当然,bigint可以代表更大的范围。
我们来测试一下当自增id达到最大值后再次插入数据会发生什么情况:
create table t(id int unsigned auto_increment primary key) auto_increment=4294967295;insert into t values(null);// 成功插入一行 4294967295show create table t;/* CREATE TABLE `t` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967295;*/
insert into t values(null);//Duplicate entry '4294967295' for key 'PRIMARY'
从实验中可以看出,当自增ID达到最大值时,将难以扩展。 第一个insert语句成功插入数据后,这张表的AUTO_INCRMENT并没有改变(依然是4294967295),这就导致第二个insert语句收到了同样的自增id值,然后尝试执行插入语句,一个字段报告冲突错误。
4、自增列应该如何维护?
在维护方面,我们主要提供以下两点建议:
以上就是关于mysql自增ID你需要了解的详细内容。 我希望它能帮助你。