【问题标题】:If you have a UUID field, should you still use an INT-based Primary Key, and set the UUID as a Unique Key, or just make the UUID Primary Key? [closed]如果你有一个 UUID 字段,你应该仍然使用基于 INT 的主键,并将 UUID 设置为唯一键,还是只制作 UUID 主键? [关闭]
【发布时间】:2021-09-11 12:12:19
【问题描述】:

这是一个针对潜在大型数据库的最佳实践问题。

我有一个向公共 API 公开的表,该 API 将存储与每一行关联的 UUID。 此 UUID 是公众能够在表格中搜索数据的唯一方式

UUID 用于外部,因为内部不需要增量 ID,它为数据提供了额外的安全层。 数据库中的其他任何地方都没有引用此行

最初,我创建的表没有自动递增 (int) ID 列,而是将 BINARY(16) UUID 列设为主键。

但是,我一直在做更多的阅读,并看到一个观点,即在大型数据集中,非顺序主键的存储和 IOps 比仅使用顺序主键呈指数增长,因为插入方法需要更多在 B+ 表上找到正确行的操作。

我对 MySQL/InnoDB 的内部运作并不精通,所以我的问题是:

拥有一个自动递增的 INT(4)/BIGINT(8) 主键——以及——一个 BINARY(16) 唯一键 == 或 == 会不会“更好”面对潜在的大型数据集时,使用非增量 BINARY(16) 作为主键?

谢谢, JP

【问题讨论】:

  • 仅供参考,有些人是 attempting to define a new Version 6 (and 7 & 8) 的 UUID 更适合在数据库中进行索引。见this article。可以在版本 1 和版本 6 之间进行转换。
  • 虽然与 UUID 作为 PK 进行比较,但额外的 INT/BIGINT AI 列增加了磁盘表的大小,但提高了 JOIN。
  • 所以是的,做更多的阅读并试图了解 mysql 的内部是如何工作的——我说 INT(4) AI-PK + BINARY(16) UK 是否正确,虽然需要更多“存储”,但会比 BINARY(16) PK 更有效地运行吗?

标签: mysql database-design devops innodb


【解决方案1】:

您的数据会比 RAM 大吗?如果是这样,UUID 的随机性就会成为性能问题。

大多数访问是通过“最近发布的”ID 进行的吗?如果是这样,按时间顺序排列的东西有利于将有趣的 id 聚集在一起,从而改善缓存。

您是否有单独的、独立的客户端生成 ID?如果是这样,您需要 UUID 或发布 id 的公共服务器。

您有很多辅助键吗?请注意,每个二级索引都有一个 PRIMARY KEY 列的副本,因此会被大 PK 放大。 (在某些情况下,这是一个人工 auto_inc PK 的论据。)

http://mysql.rjweb.org/doc.php/uuid

【讨论】:

  • 有趣的阅读感谢您的链接。这个问题已经结束,但现在我已经使用 UUID 作为 PK。我最终会聘请一位数据库顾问来审查我的初始设置。这只是 MVP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
相关资源
最近更新 更多