我无法为自己想象一个好的答案,所以我想在这里问一下。在我看来,我总是想知道如果我的 MySQL 表中的AUTO INCREMENT PRIMARY ID
列用尽了会发生什么?
比如说,我有一个有两列的表。 ID (auto increment, primary, BIGINT unsigned
)和 DESC (VARCHAR 255
)。我确信BIGINT
很多,但它可以达到极限。如何处理 ID 达到其限制的情况?我需要另一台服务器吗?如果那么我该怎么同步呢?这是正确的方法吗?任何见解的朋友。
答案 0 :(得分:43)
它不会耗尽。
最大bigint是9223372036854775807。在1000插入/秒,这是106751991167天的价值。如果我的数学是正确的话,将近3亿年。
即使您将其分区,也可以使用偏移,其中100个服务器各自具有值的专用子范围(x*100+0
... x*100+99
),您将不会耗尽。 10,000台机器每秒进行100,000次插入可能会在大约三个世纪内到达那里。当然,数百年来每秒交易的数量比纽约证券交易所更多......
如果执行超出生成密钥的数据类型大小限制,则新插入将失败。在PostgreSQL中(因为你已经用bigserial
标记了这个PostgreSQL),你会看到:
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位,因此您将达到必须将密钥类型更改为{{ 1}}或得到如下错误:
bigint
如果您确实认为您的网站可能会在应用程序中达到bigint的限制,那么您可以使用复合键 - 比如说(shard_id,subkey) - 或者使用uuid键。
尝试在新应用程序中处理此问题是过早优化。说真的,从新的应用程序到这种增长,你会使用相同的架构吗?还是数据库引擎?甚至代码库?
您可能还担心GUID密钥系统中的GUID冲突。毕竟,生日悖论意味着GUID collisions are more likely than you think - 令人难以置信,绝对不可能。
此外,正如Barry Brown在评论中指出的那样,你永远不会存储那么多数据。这只是高流失表的一个问题,具有极高的交易率。在这些表中,应用程序只需要能够处理重置为零的键,重新编号的条目或其他应对策略。但老实说,即使是高流量的消息队列表也不会出类拔萃。
请参阅:
说真的,即使你构建了下一个Gootwitfacegram,在你的第三个应用程序重写的使用期限之前,这也不会有问题......
答案 1 :(得分:11)
Big int 2 ^ 63 或约 10 ^ 19 。 数据库基准测试几年前风靡一时,使用标准化的TPC-C Benchmark
您可以看到关系数据库的最快关联分数 30,000,000 (每分钟3x10 ^ 7个事务)。请记住,配置文件将包含大量读取,并且同一系统不太可能每分钟写入 30,000,000 行。
假设它是,你需要大约 3x10 ^ 11 分钟才能耗尽BigInt。在时间测量中,我们理解,这就像 600万年
ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
如果你用完了,你会得到上面的错误信息,并转到Guid获取主键。 2 ^ 128 ,有less digital bits on earth比这个数字(乘以千万亿)。
答案 2 :(得分:2)
大型数据集不使用递增数字作为键。不仅因为你有一个隐含的上限,而且当你有多个服务器时它也会产生问题;因为它们具有重复的主键,因为它们是增量的。
当你达到MySQL的这个限制时,你会得到一个像这样的神秘错误:
Error: Duplicate entry '0' for key 1
最好使用您生成的唯一ID或其他序列。 MySQL不支持序列,但postgresql支持序列。
答案 3 :(得分:2)
一旦AutoIncrement达到字段大小的限制,INSERT将生成错误。
实际上,您将收到以下类型的错误:
ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
欲了解更多信息,请访问:
http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html