繁体   English   中英

达到 MySQL 中 ID 的最大限制

[英]Reaching the Max Limit for Ids in MySQL

在 mySQL 中,我使用主键作为 UINT32。 ID 将很快达到 4,294,967,295 的限制。 我的服务是一个节点应用程序。

有效处理这种情况的解决方案是什么?

我在我的节点应用程序中使用 schemapack.js 进行 object 序列化。 无法使用 BIGINT 或 UINT64,因为 schemapack 不支持该数据类型。

此表未在历史背景下使用。 只有实时服务使用此表。

https://github.com/phretaddin/schemapack#here-is-a-table-of-the-available-data-types-for-use-in-your-schemas

我能想到的方法:

  1. 当 ID 接近最大限制的 1% 时创建一个新表。 这种方法的问题是必须有效地通知所有其他服务表名的更改。 它可能导致多个竞争条件和许多故障。 有多个集群运行节点应用程序。

  2. 由于此表未在历史上下文中使用,因此可以用新数据覆盖旧数据。 达到限制后将 ID 重置为 0 并覆盖旧记录。

  3. 达到限制后,删除表的一部分。 将表划分为段,每次达到限制时使用队列方法删除段(先进先出)。

说出适合您情况的最佳方法是非常主观的。 这是关于为您的应用程序/设置权衡不同解决方案的优缺点。

我不熟悉 schemapack,但我猜 32 位 integer 限制源于 JS 本身不支持 64 位整数的事实(尽管BigInt正在解决这个问题)。 传统的Number JS 类型可用于高达 53 位的整数而不会牺牲精度,但这并不完全是 64 位。

如果需要在 JS 中支持 64 位整数,可以使用字符串类型。 它肯定会更慢,但对于您的特定情况,这可能不明显/不重要。 编码为字符串/varchars 的整数可能会占用更多空间(您可以考虑将这些整数编码为 HEX,这将比标准十进制表示更节省空间,但同时相对方便)。 这种方法也更容易出错。 总的来说,如果您不能或不想使用BigInt ,如果您需要处理更大的数字,字符串可能是一个合理的解决方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM