【发布时间】:2012-09-20 17:19:08
【问题描述】:
我的场景:
- 新的 Cake (2.x) 项目,还没有 DB
- MySQL 集群,也许是 Oracle 集群产品
- 无需迁移/导入数据
- 数据可能如下所示:
Users-> HABTM ->Groups-> HABTM ->Other Groups
我一直在对如何在 CakePHP 中使用 UUID 进行一些研究,我发现了以下内容:
Cake 原生支持 UUID,但它假定 CHAR(36):
http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html
Stack Answer 指出:
将 UUID 作为 CHAR(36) 的成本高得离谱,并且变成 愚蠢的 1+ 百万,10+ 百万,100+ 百万行,在我的卑微 经验
这个Blog Post声称BINARY(36)优于CHAR(36):
虽然 CakePHP 不支持 16 字节十六进制编码的 UUID BINARY(16) 的键类型,它确实支持 BINARY(36),它仍然是 比使用 CHAR(36) 更好,它可以通过排序来减慢。
...但是 Cake Docs 并没有这么说...
我的问题是,考虑到 CakePHP/MySQL(或 CakePHP/Oracle),CHAR(36) 是这里唯一合理的选择,还是有更好、更有效的方法来使用带有 CakePHP(或任何其他 PHP 框架)的 UUID那件事)?
【问题讨论】:
-
请记住,如果您使用
innodb,那么您的主键将被附加到每个索引并且您将有一个显着的开销在索引大小。通常,PK 数据类型越小越好。就个人而言 - 我更喜欢总是使用整数。 -
同意开销,但不幸的是,对于此应用正在创建的记录,它们需要是全球唯一的,这确实会影响性能。
-
我同意,BINARY 比 CHAR 性能要好得多,这里记录了 3.x 方式:github.com/dereuromark/cakephp-shim/blob/3.0/docs/…
-
BINARY(16)的性能甚至更高,但是需要在 DB 中显式地显示hexing 和unhexing 值的麻烦会让你避免它。顺便说一句,一篇旧博客文章提到了CHAR(36)与BINARY(16)的快速基准测试是here,我相信BINARY(36)将介于这两者之间;可能更倾向于好的一面;) -
@mark 链接已失效,是否有其他来源?
标签: php mysql oracle cakephp-2.0 uuid