【问题标题】:When to fix auto-increment gaps in MYSQL何时修复 MYSQL 中的自增间隙
【发布时间】:2010-12-29 07:43:22
【问题描述】:

我现在正在处理的数据库中有成千上万的记录被添加和删除,因此在自动递增的密钥中存在数十万大的差距,而自动递增的数字则达到数十亿。

这些数字永远不会存储以引用单个记录,而是用于在进行动态计算时引用记录。

是否有任何理由消除这些间隙并重置自动递增数字,或者这无关紧要?

id 字段是一个 unsigned int,我应该将它增加到一个 unsigned big int 吗?据我了解,现在如果它达到 4,294,967,295,它就会崩溃。

【问题讨论】:

  • 有没有可能你有一个UNIQUE 索引可以用来代替id,然后去掉这个id?

标签: mysql auto-increment


【解决方案1】:

我担心的唯一原因是,如果您发现自己接近 2^32 限制。如果您不使用列作为行 id,那么甚至不用担心。

编辑如果您将此列用于任何类型的识别信息,那么我会将该列切换为 GUID 或其他内容,因为您会溢出,然后您会得到重复的值。这不是bueno。

【讨论】:

  • "自动将数字增加到数十亿。" 2^32只有40亿,给几亿。也许现在是开始担心的好时机,以免为时已晚。
  • UUID/GUID 可能会导致其他性能问题。小心往那个方向走。
【解决方案2】:

我不知道您的自动增量字段的增长率是多少,但应该是简单的数学计算,您可以估计何时会达到 4294967295 的限制。

如果您仍然觉得需要做某事,您有以下选择:

  1. 将当前计数重置为 1。最好通过删除列并重新创建它来执行此操作。由于您没有将此字段用于参照完整性,因此应该是一个快速简单的修复方法,直到下次...
  2. 将数据类型更改为无符号 BIGINT。现在您可以增加到 18446744073709551615。但是您需要在堆中更多的空间来存储这些增加的数据量,而您只是推迟了您的问题。
  3. 从自动增量(INT / BIGINT)更改为UUID。这样您就可以不用再担心数字和无穷大的性质了,但您很可能不得不更改所有客户端代码。

另外,我感觉到这里前面某处有一两个糟糕的决定。

【讨论】:

  • 同意,为什么要删除成千上万的记录?您可能想重新考虑您的规范化。
  • 该表用于存储研究数据。一旦计算完成,就没有理由再保留计算数据并被删除。
  • INSERT 18446744073709551615 行需要几个世纪的时间——如果不人为调整 id,就不可能达到这个限制。
猜你喜欢
  • 2013-08-01
  • 2012-11-01
  • 2019-09-21
  • 1970-01-01
  • 2018-07-14
  • 2017-10-26
  • 1970-01-01
  • 2012-06-20
相关资源
最近更新 更多