MENU

MySQL一道经典面试题:自增id不够用了怎么办

概述

今天小编来给各位分享一道很基础但是容易踩坑的MySQL面试题,具体情况是这样的:
一位年前辞职,疫情状况稳定后出来找工作的朋友小x,在技术面试时被面试官问到了一道很经典的问题
Interviewer(Q)
Interviewee(A)

Q:以前做项目的时候用过什么数据库
A:MySQL用到的比较多,其他数据库也稍微接触过一些
Q:看来你对MySQL应该是比较了解的(interviewer微微一笑)
A:遇到的MySQL问题基本都能解决(此时的小x信心满满)
Q:那接触过MySQL的auto_increment吧
A:自增主键,经常用
Q:那请你说说如果一个表的自增id用完了,再插入数据会出什么问题?
A:那就没法再插入数据了(依旧信心满满)
Q:你之前遇到过这种情况?
A:之前做的项目规模都比较小,没遇到过这种情况
Q:那为什么自增id用完了就不能插入数据了呢?
A:因为自增id用完了呗
Q:……
Q:具体原理呢?
A:额……
Q:那换个问题,如果自增id用完了,你有什么好办法在不影响业务的前提下解决这个问题呢?
A:(紧张地想了半天)把主键改成long?
Q:今天到这吧,回去等二面通知

问题

小x和面试官这段对话的核心问题就是:
1) MySQL的自增id用完了会有什么问题,为什么会出现这种问题
2) 遇到自增id用完的问题应该怎么办

解答

问题1的产生是因为自增id用是有范围的,如果用bigint,最大值为18446744073709551613。
面试过程中没有提及bigint,且把bigint用完也不是短时间内能完成的。
面试中其实说的是int,有符号int最大值为2147483647,无符号int最大值为4294967295
21亿条记录,如果数据量大的话很快就没法进行自增了。
当第2147483647条记录被写入,再想写入数据时,MySQL没有办法对2147483647再次自增,所以还会使用2147483647作为主键,故会报主键冲突的错误

问题2其实也很好解决,如果对性能和存储的要求比较低,办法比较简单,把自增id的类型改为varchar,用uuid作为主键就可以了。如果是分布式架构,需要快速部署则用uuid(多花费存储费用,牺牲部分性能),如果需要效率,主键完全可以采用类似SnowFlake的算法构造全局自增id。


文章标题:MySQL一道经典面试题:自增id不够用了怎么办
如果文中内容侵犯了您的权益,请及时与博主取得联系进行删除!
本站文章未经许可禁止转载,本文地址:https://blog.wanvale.com/archives/87/

Last Modified: June 20, 2020
Archives QR Code Tip
QR Code for this page
Tipping QR Code