数据库自增id用完了会怎么样?

665 阅读2分钟

这是我参与更文挑战的第1天。

来源

起因是在沸点摸鱼的时候看到这个问题,觉得挺有意思的。虽然做开发也好几年了,但是从来没有想过这个问题,仔细想了想,好像也情有可原。

以我们最常用到的mysql为例,它支持最大的整形是bigint,bigint在mysql中占8个字节,也就是说它的上限最大值是2^64,以这个数量级来说,早已经超出了mysql单机单表的处理能力。

正常来说,当mysql的数据量达到千万级别,性能就会开始下降,需要开始着手优化库表,其中最大的性能瓶颈应该要属sql查询。

即使做了一系列优化之后,但是当数据量达到10亿级别,基本已经是mysql的极限了。这时候不分表分库的话,业务操作难以持续。 所以即使你用的自增id是int类型,4个字节,它的极限也有21亿多。当数据达到这个量级我们早就开始考虑做分表分库了,但是我们都知道分表分库的话,肯定是不能采用自增id了,因为这时候采用自增id没办法保证自增id的唯一性。通常我们会考虑使用类似雪花算法来生成系统的id

那么说了这么多,我们可以得出一个结论:面试官太闲了! (手动狗头)

自增id用完了继续插入数据会发生什么?

这个其实也可以分为两种情况来分析:

  1. 设了自增主键ID 这种情况,在自增id用完之后会报如下主键重复的错

Duplicate entry '*****' for key 'PRIMARY'

需要注意的是在mysql5.7之后报的是另外一个错误

SQL Error (167): Out of range value for column 'id'.

所以这种情况下,可能会报数据越界的错误,或者自增id冲突的错误。

  1. 没有设自增主键id 如果没有设置主键的话,InnoDB则会自动帮你创建一个6个字节的row_id,由于row_id是无符号的,所以最大长度是2^48-1。

这种情况,数据会从下标0开始覆盖数据。

大家可以自行设置一下row_id验证一下。

感谢阅读。