当前位置: 首页 > 面试题库 >

当我用尽bigint生成的密钥时会发生什么?怎么处理呢?

慕容宏毅
2023-03-14
问题内容

我无法想象自己对此有一个很好的答案,所以我想到了在这里提问。在我看来,我一直想知道如果AUTO INCREMENT PRIMARY ID我的
MySQL 表中的列用完了会怎样?

举例来说,我有一个包含两列的表。的 IDauto increment, primary, BIGINT unsigned)和
DESCVARCHAR 255)。我当然知道BIGINT很多,但是可以达到极限。如何处理场景,其中 的情况下,ID
达到它的极限?我需要其他服务器吗?如果可以,该如何同步呢?这是正确的方法吗?任何有识之士的朋友。


问题答案:

它不会用完。

最大bigint为9223372036854775807。以1000次插入/秒计算,这相当于106751991167天。如果我的数学正确的话,将近3亿年。

即使您使用偏移量对它进行分区,例如每个服务器有100个服务器具有值的专用子范围(x*100+0
x*100+99),您也不会用光。10,000台机器每秒执行100,000次插入操作可能会在大约三个世纪的时间内使您到达那里。当然,数百年来,每秒的交易量比纽约证券交易所高。

如果 确实
超出了所生成密钥的数据类型大小限制,则新插入将失败。在PostgreSQL中(因为您已经将此PostgreSQL标记了),bigserial您将看到:

CREATE TABLE bigserialtest ( id bigserial primary key, dummy text );
SELECT setval('bigserialtest_id_seq', 9223372036854775807);
INSERT INTO bigserialtest ( dummy ) VALUES ('spam');

ERROR:  nextval: reached maximum value of sequence "bigserialtest_id_seq" (9223372036854775807)

对于普通用户,serial您将得到不同的错误,因为sequence始终为64位,因此您将不得不将密钥类型更改为bigint或得到如下错误:

regress=# SELECT setval('serialtest_id_seq', 2147483647);
regress=# INSERT INTO serialtest (dummy) VALUES ('ham');
ERROR:  integer out of range

如果您真的相信您的网站有可能达到应用程序中bigint的限制,则可以使用复合键-例如(shard_id,subkey)或uuid键。

尝试在新的应用程序中进行处理是过早的优化。认真地说,从新应用程序到这种增长,您会使用相同的架构吗?还是数据库引擎?甚至是代码库?

您可能还担心GUID键控系统中的GUID冲突。毕竟,生日悖论意味着GUID碰撞比您想象的更可能发生 -难以置信地,疯狂地不可能。

此外,正如巴里·布朗(Barry
Brown)在评论中指出的那样,您永远不会存储那么多数据。这只是交易率高得离谱的高流失率表的一个问题。在这些表中,应用程序仅需要能够将密钥重置为零,重新编号条目或采用其他应对策略。坦白说,即使是高流量的消息队列表也不会被淘汰。

看到:

  • 此IBM有关连续耗尽的信息
  • 最近有关此主题的博客文章

严重的是,即使您构建下一个Gootwitfacegram,也要等到第三个应用程序重写的使用日期之前,这才不会成为问题。



 类似资料:
  • 问题内容: 如果我多次将相同的键传递给的方法,那么原始值会怎样?如果值重复出现该怎么办?我没有找到任何文档。 情况1:密钥的覆盖值 我们得到surely not one。 情况2:重复值 我们得到。 但是其他值怎么办?我在向学生教授基础知识,有人问我。是等,其中最后一个值引用(但在内存中)水桶? 问题答案: 根据定义,该命令将替换与映射中给定键相关联的先前值(概念上类似于对原始类型的数组索引操作)

  • 我在yarn cluster上运行的spark应用程序崩溃了,我正在试图确定根本原因。在我使用从yarn获得的日志中,我看到在块获取期间有一大堆连接被拒绝,还有一个内存不足错误。很难说出根本原因是什么。我的问题是当容器因为OutOfMemory异常而被杀死时会发生什么。因此,在容器日志中,我看到这是如何在容器上启动执行器的 我还看到许多。在应用程序崩溃之前,似乎有多个这样的问题。spark重试一个

  • 问题内容: 我知道Java I / O使用装饰器模式。但是我觉得我理解它的错。 请说明两个代码段之间的区别: 片段1: 该应用程序符合我的期望,并且在控制台中看到结果。 片段2: 我尝试两次包装ObjectInputStream和ObjectOutputStream: 这段代码只是挂断了。我不明白为什么。请澄清。 聚苯乙烯 这仅仅是理论问题。 更新 真正的挂断行为是因为我使用管道而发生的(根据EJ

  • 我正在尝试创建一个公钥以允许我推送到Git,但我的. ssh文件夹尚未创建。 以下是我运行的命令: $ssh-keygen-t rsa-Cemaill@me.com 生成公共/私有rsa密钥对 输入保存密钥的文件(/h/.ssh/id\u rsa): 这就是H:驱动器配置、数据、配置文件、配置文件中的全部内容。V2 我认为有一个问题,因为当我得到提示输入文件,其中保存密钥(/h//. ssh/id

  • 我有基于的图像,当这些(我的)图像生成时,被下拉,以便生成我自己的图像。因此,在我的本地计算机中,我有映像。假设基映像得到更新,Microsoft发现该映像中有一个bug,并决定对该标记进行修复,因此它仍然被称为,但实际上它与我构建自己的映像时不同。 所以我有两个问题: 1。每次我的图像被拉下,它会得到我建立图像时的基础图像,对吗?(这似乎很明显,但我需要检查) 2。如果我注意到(网钩,扳机?)有

  • 我已经从服务器的category类中提取了数据。getcategories方法返回包含旋转器项的字符串列表。当我点击旋转器项时。什么都没发生。我的代码有什么错误吗。请帮帮忙。 这是我的Java密码。 这是我的布局