67

我有一个数据库,它快速填充了我们每天谈论 10-20k 行的数据。

带有自动增量选项的 ID 的限制是什么?如果 ID 被创建为 INTEGER 那么我可以为无符号值做 2,147,483,647 的最大值吗?

但是当自动增量超过这个值时怎么办?一切都崩溃了吗?那会有什么解决办法呢?

我相信很多人都有大数据库,我想听听他们的意见。

谢谢你。

4

2 回答 2

73

如果您担心它增长过快,我会将 PK 设置为 UNSIGNED BIGINT。这给你一个最大值 18446744073709551615,这应该足够了。

于 2012-05-22T17:37:31.043 回答
43
                    | Min. (inclusive)           | Max. (inclusive)
-----------------------------------------------------------------------------
INT Signed (+|-)    |             -2,147,483,648 |              2,147,483,647
-----------------------------------------------------------------------------
INT Unsigned (+)    |                          0 |              4,294,967,295
-----------------------------------------------------------------------------
BIGINT Signed (+|-) | -9,223,372,036,854,775,807 |  9,223,372,036,854,775,806
-----------------------------------------------------------------------------
BIGINT Unsigned (+) |                          0 | 18,446,744,073,709,551,615

MySQL 参考资料

如果您的 MySQL 表的列 ID (INT unsigned) 具有 auto_increment,并且该表有 4,294,967,295 条记录,那么您尝试再插入 1 条记录,新记录的 ID 将自动更改并设置为最大值“4,294,967,295 ",因此您会收到一条 MySQL 错误消息Duplicate entry '4294967295' for key 'PRIMARY',如果该列设置为主键,您将有重复的 ID。

2个可能的解决方案:

  1. 简单的方法:通过将 ID 设置为BIGINT unsigned来扩展限制,就像Dan Armstrong所说的那样。虽然这并不意味着它是牢不可破的!当表变得非常大时,性能可能会受到影响。
  2. 更难的方法使用分区,这是一种更复杂的方法,但性能更好,并且真正没有数据库限制(您唯一的限制是物理硬盘的大小。)。Twitter(和类似的大型网站)每天使用这种方法处理数百万条推文(记录)!
于 2013-12-22T12:37:17.660 回答