数据库取值范围(面试官:mysql自增长id用完了怎么办?这是我见过最中肯的答案了)

数据库取值范围(面试官:mysql自增长id用完了怎么办?这是我见过最中肯的答案了)

数据库取值范围?许多人对数据库取值范围称为, 数据库取值范围是什么的问题没有了解,本站就来讲讲数据库取值范围称为, 数据库取值范围是什么的问题,希望我的解答对你有所帮助。



张工是一名java程序员,最近到一家互联网公司面试,面试官就问了他这样的一个问题。

张工:"用的是自增主键"

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

张工:“用完了就用完了,再申请呗”

面试官:“你可以回去等通知了”

数据库取值范围(面试官:mysql自增长id用完了怎么办?这是我见过最中肯的答案了)

在mysql,int整型的范围如下int的取值范围为:-2^31——2^31-1,即-—

我们来动手实践下。

然后向这张表插入一条数据:

insert into tb_user values(null);

通过show命令show create table tb_user;查看表情况:

把我们刚才的创建表语句调整下,先把刚才的表删除掉,然后在创建表时加上auto_increment =

然后同样往表插入一条记录

insert into tb_user values(null);

同样,我们通过show命令,查看表tb_user的表结构:

select * from tb_user

当想往表在尝试插入一条数据时,报一个主键冲突异常如下所示。

[SQL]insert into tb_user values(null);[Err] 1062 - Duplicate entry '' for key 'PRIMARY'

,这个数字已经可以应付大部分的场景了,如果你的服务会经常性的插入和删除数据的话,还是存在用完的风险。

建议采用bigint unsigned,这个数字就大了。

那有什么办法解决,答案是肯定的,解决方法也是很简单的,将Int类型改为BigInt类型,BigInt的范围如下

-2^63-1到2^63-1

就算每秒往数据表插入条数据,运行100年,来看看数据量有多少

*24*3600*365*100=

如果你在面试中是这样回答面试官的。

你:"这还不简单,把自增主键的类型改为BigInt类型就可以解决了!"

你:“…………没有实际操作过”

需要注意的是,这种方式在myl5.6+才开始支持,mysql支持在线修改数据库表,在修改表的过程中,对绝大部分操作,原表可读,也可以写。

对于修改数据类型这种操作,是不支持并发的DML操作!也就是说,如果你直接使用alter这样的语句在线修改表数据结构,会导致这张表无法进行更新类操作(delete、update、insert)。所以,想在生产线上执行修改表结构这样的方案是不可行的。

那有没有更好的方式,对于这个问题,我们以后再做讨论。

要是实际生产表出现单表超过上亿的数据量了,这时候想再往数据表写数据,性能肯定是受影响了,得赶紧考虑分库分表了。

所以在实际中,根本等不到自增主键用完的情况。

较友好的回答不妨参考这样的

你:这问题没遇到过,因为自增主键我们用int类型,一般达不到最大值,就要考虑分表分库了。

要是面试官穷追不舍,继续问你有关分库分表的要点,你也就可以针对性地回答,说明你完全有这方面的开发经验,相信能为这次面试加分。

因此在做数据字典设计时,要根据业务的需求来选择合适的字段类型。

由于笔者知识及水平有限,文中错漏之处在所难免,如有不足之处,欢迎交流。

以上是关于数据库取值范围的相关信息,了解更多关于数据库取值范围称为, 数据库取值范围是什么内容请继续关注本站。

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有

相关阅读