【发布时间】:2011-01-22 20:03:01
【问题描述】:
我们正在考虑使用 UUID 值作为 MySQL 数据库的主键。插入的数据是从数十、数百甚至数千台远程计算机生成的,并且以每秒 100-40,000 次插入的速度插入,我们永远不会进行任何更新。
在我们开始剔除数据之前,数据库本身通常会达到大约 5000 万条记录,因此不是一个庞大的数据库,但也不是很小的。我们还计划在 InnoDB 上运行,但如果有更好的引擎来支持我们正在做的事情,我们愿意改变这一点。
我们已经准备好使用 Java 的 Type 4 UUID,但在测试中发现了一些奇怪的行为。一方面,我们存储为 varchar(36),我现在意识到使用 binary(16) 会更好——尽管我不确定会更好。
更大的问题是:当我们有 50M 条记录时,这些随机数据会破坏索引有多严重?例如,如果我们使用最左边的位带有时间戳的类型 1 UUID,我们会更好吗?或者我们应该完全放弃 UUID 并考虑 auto_increment 主键?
我正在寻找有关不同类型 UUID 在 MySQL 中作为索引/主键存储时的性能的一般想法/提示。谢谢!
【问题讨论】:
-
缺少一个重要细节:主键是由日志服务器生成还是由客户端机器自己生成?
-
@hop 它们是由插入数据的 10-1000 个客户端生成的
-
您的场景中哪里需要通用唯一性?我的建议是坚持使用 auto_increment 并使用单独的字段来描述发送数据的远程计算机。无需在这里重新发明轮子。
标签: mysql performance innodb sequence uuid