PostgreSql表中UUID、CHAR和VARCHAR之间的性能差异?

41

我正在将UUID v4值存储在PostgreSQL v9.4表中的"id"列下。

在创建表时,如果我将"id"列定义为VARCHAR(36), CHAR(36)UUID数据类型,是否会对写入或读取性能产生影响?

谢谢!


3
就我所知,UUID类型使用16个字节,基本上将UUID存储为一个128位整数。而char(36)varchar(36)会使用36个字节。但是,我似乎找不到这个信息的文档了。除此之外,如果您的UUID将作为键并且您计划使用CLUSTER选项,则需要注意PostgreSQL如何对表/索引进行聚集的影响。 - Bacon Bits
1
http://simononsoftware.com/how-to-store-uuids-in-postgresql/ - Craig Ringer
3个回答

73

使用uuid。 PostgreSQL 有本地类型的原因。

它将 uuid 作为 128 位二进制字段内部存储。您提出的其他选项将其存储为十六进制,与之相比非常低效。

不仅如此,而且:

  • uuid 对于排序执行简单的按字节排序。textcharvarchar 考虑到字符集和区域设置,对于 uuid 来说没有意义。

  • 只有一种规范的 uuid 表示法。对于文本等内容则不是真的;您必须考虑大写 vs 小写十六进制,存在或不存在 {...-...} 等等。

毫无疑问。使用uuid

唯一有意义的其他类型是 bytea,至少可以直接用于存储 uuid 的 16 个字节。如果使用某些基本集之外的数据类型(例如非常愚蠢的 ORM)的系统,则会这样做。


8

UUID(通用唯一识别码)是最快的,因为它是128位,即16个字节,并且比较是以数字方式进行的。

Char(36)和varchar(36)似乎相同且速度较慢:http://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/

服务器应该检查EOF以确定读取值的工作是否完成,对于每个字符都要这样做。

此外,文本比较比数字比较慢。由于UUID由16个字节组成,因此比较UUID比比较两个长度为36个字符的文本要快得多。

为了提高性能,请使用本地UUID。


你的解释是不正确的。在PostgreSQL中存储时,charvarchar之间没有显着性能差异。两者都在内部作为VARLENA存储。此外,UUID是16字节(128位);我不知道你从哪里得到“5个十六进制值”。 - Craig Ringer
1
好的,我也说过它是128位和16字节。5个十六进制值来自定义,请阅读:http://stackoverflow.com/questions/32188497/mysql-custom-alphabetical-column-order - Abdullah Nehir
关于char和varchar相同的问题,是的,你是对的:http://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/ - Abdullah Nehir
1
我在维基百科上查了UUID,发现只使用了5个十六进制部分来显示128位。从版本1到版本5,UUID生成算法已经发生了改变。现在,128位由较小的部分(如MAC地址、日期、随机算法、SHA-1加密等)生成,并显示为5个十六进制值。因此,以5个部分显示对计算和比较没有影响。答案已经修正。 - Abdullah Nehir
只是为了澄清,UUID并没有“版本”,而且更新的版本不一定比旧版本更好。这些只是适用于不同用例的不同类型的UUID。 - Mephisto

1
索引大小或许是最显著的差异:VARCHAR类型大约增加了86%。就性能而言,在PostgreSQL 9.5中我没有注意到明显的差异。

5
你能用数据支持这个说法吗?具体的测量数据,表格布局是怎样的? - sophros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接