好好爱自己!

[转]Mysql 数据库自增列达到最大值之后怎么办?

 

原文:https://www.jianshu.com/p/6815674eacad/

------------------

相信有不少人在面试的时候都会碰到这样的场景!

面试官:"用过MySQL吧,你们是用自增主键还是UUID?"

你:"用的是自增主键。"

面试官:"为什么不用UUID,而用自增主键?"

你:"因为采用自增主键,数据在物理结构上是顺序存储,性能最好....."

面试官:"那自增键的最大值是多少?自增键达到最大值了,用完了,你怎么办"

你:"what,自增键的值能用完?"

恰好我学弟在面试时也遇到了。我觉得挺有意思的,所以就这个问题。来谈谈“这个自增主键用完了该怎么办!”

首先我们要清楚一点,在MySQL中Int整型的范围如下:

 

以无符号整型为例,其最大值为:4294967295。大哥,这是约为43亿啊!正常情况下,单表是不可能达到这个值的啊!当然如果频繁的删除或者频繁消耗自增列的值,单表到达42亿也是日可待。

一旦自增id达到最大值,此时数据继续插入是会报一个主键冲突异常如下所示:

//Duplicate entry '4294967295' for key 'PRIMARY'

这时,解决方法也很简单,只需要把 Int 改为 BigInt 。BigInt的范围如下:

 

其最大值:18446744073709551615,好吧!我已经不知道怎么读了。具体用完时间,如下所示:

 

因此,将 Int 改成 BigInt。你根本不用考虑自增长值会达到最大值越界问题。

当然了。在实际的项目中,我们也不可能这么干。因为数据到达一定的量以后。你每次查询所花费的时间越长,如果还有联合查询的话。不说是亿量级的数据,就算只有几千万,几百万。那程序都有可能死在那儿。

这个时候你就要考虑分库分表了。一旦分库分表了,就不能依赖于每个表的自增ID来全局唯一标识这些数据了。此时,我们就需要提供一 个全局唯一的ID号生成策略来支持分库分表的环境。同时分库分表 还可以减小数据库的负担,缩短查询时间。

具体的分库分表策略,你需要关注 【不正经的码农】 回复 【mycat】即可领取教程资料。

回到面试官的问题:“那自增主键达到最大值了,用完了怎么办?”;

专业点回答:

"这问题没遇到过,因为自增主键一般用int类型,一般达不到最大值,我们就分库分表了,所以不曾遇见过!"

想学习MySQL 的小伙伴们 可关注【不正经的码农】回复【mysql】即可免费领取视频教程+ 课程笔记。



作者:逝吣
链接:https://www.jianshu.com/p/6815674eacad/
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
posted @   立志做一个好的程序员  阅读(1122)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2020-12-17 【转】Simple Golang DNS Server
2020-12-17 Can SSL be used to encrypt non-HTTP data? [closed]
2020-12-17 【转】golang证书认证通信
2018-12-17 nginx rewrite only specific servername to https

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示