【发布时间】: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