【发布时间】:2010-10-03 01:17:47
【问题描述】:
现在缓存数据如此频繁,并且只有在有新数据时才访问数据库(然后缓存数据,哈哈),使用 Int 主键与 UUID 主键甚至存在真正的性能差异。
例如,假设我正在构建 NetFlix。新电影被添加到数据库中,电影列表和相关数据被放入缓存中。
用户搜索电影(由搜索服务器处理),然后找到一个列表,点击它,然后从缓存中检索数据。
在整个过程中,从不读取数据库。
你有什么想法?
【问题讨论】:
现在缓存数据如此频繁,并且只有在有新数据时才访问数据库(然后缓存数据,哈哈),使用 Int 主键与 UUID 主键甚至存在真正的性能差异。
例如,假设我正在构建 NetFlix。新电影被添加到数据库中,电影列表和相关数据被放入缓存中。
用户搜索电影(由搜索服务器处理),然后找到一个列表,点击它,然后从缓存中检索数据。
在整个过程中,从不读取数据库。
你有什么想法?
【问题讨论】:
我是类似于 Netflix 的主要网站的架构师,您在很大程度上是正确的,几乎所有非事务性数据都被缓存,因此优化数据库并不总是奏效。我们所有的电影标题都通过重复任务预加载到 memcached 中,因此对于系统的库部分,数据库永远不会被实际客户访问。
不过,我们在设计数据库结构和查询时并没有懈怠,因为我们希望预加载器尽可能快速高效地运行。
【讨论】:
我喜欢使用 UUID(实际上是GuidCombs)作为主键。确实,它确实使指标膨胀了一些,但是到处都是 64 位 RDBMS,而且内存非常便宜,我认为优点远远超过缺点。不必等到你插入后才知道你的 PK 是我最喜欢的。
【讨论】:
我支持 Chris 的回答,但我也想指出,如果尝试一次将很多键加载到内存中,那么您将使用大量内存。
比较:
6ba7b810-9dad-11d1-80b4-00c04fd430c8 - 37 个字节,如果 \0 终止则为 38 个字节
64 位整数只有 8 个字节。并且可能可以存储在单个寄存器中。
将此提升到一个新的水平。
假设您想将 100,000 个 ID 加载到 ram 中。
这将是 800,000 字节(64 位整数)或 3,800,000 字节!
更新:2010 年 10 月 8 日。
另外,验证 UUID 字符串有点困难,您必须使用正则表达式。
但是,验证整数很简单。 intval() php,或 .to_i ruby,以及 int() for perl。
这提高了其他人向您发送可疑数据(网络机器人)的安全性
【讨论】: