原文: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/
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。