在mysql中int类型占四个字节,有符号书的话,最大值就是(2^31)-1,也就是2147483647,二十多亿。
然后如果这个自增主键达到最大值,是会报错的
Duplicate entry '2147483647' for key 'PRIMARY'
错误翻译过来的意思大概是主键2147483647重复了。
解决方法:
①、修改id字段类型,int改为bigint(太占空间了,一个bigint的存储大小为8字节) bigint的大小是8个字节,一个字节8位,有符号的最大值就是2的63次方-1
②、有能力还是分表,有效避免这个问题
③、将int类型设置为无符号的可以扩大一倍
有符号int最大可以支持到约22亿,远远大于我们的需求和MySQL单表所能支持的性能上限。
对于OLTP应用来说,单表的规模一般要保持在千万级别,不会达到22亿上限。如果要加大预留量,可以把主键改为改为无符号int,上限为42亿,这个预留量已经是非常的充足了。
使用bigint,会占用更大的磁盘和内存空间,内存空间毕竟有限,无效的占用会导致更多的数据换入换出,额外增加了IO的压力,对性能是不利的。
因此推荐自增主键使用int unsigned类型,但不建议使用bigint
有能力选择分表,更好解决这个问题。