我正在将UUID v4值存储在PostgreSQL v9.4表中的"id"列下。
在创建表时,如果我将"id"列定义为VARCHAR(36), CHAR(36)或UUID数据类型,是否会对写入或读取性能产生影响?
谢谢!
我正在将UUID v4值存储在PostgreSQL v9.4表中的"id"列下。
在创建表时,如果我将"id"列定义为VARCHAR(36), CHAR(36)或UUID数据类型,是否会对写入或读取性能产生影响?
谢谢!
使用uuid
。 PostgreSQL 有本地类型的原因。
它将 uuid 作为 128 位二进制字段内部存储。您提出的其他选项将其存储为十六进制,与之相比非常低效。
不仅如此,而且:
uuid
对于排序执行简单的按字节排序。text
、char
和 varchar
考虑到字符集和区域设置,对于 uuid 来说没有意义。
只有一种规范的 uuid
表示法。对于文本等内容则不是真的;您必须考虑大写 vs 小写十六进制,存在或不存在 {...-...}
等等。
毫无疑问。使用uuid
。
唯一有意义的其他类型是 bytea
,至少可以直接用于存储 uuid 的 16 个字节。如果使用某些基本集之外的数据类型(例如非常愚蠢的 ORM)的系统,则会这样做。
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。
char
和varchar
之间没有显着性能差异。两者都在内部作为VARLENA
存储。此外,UUID是16字节(128位);我不知道你从哪里得到“5个十六进制值”。 - Craig Ringer
char(36)
或varchar(36)
会使用36个字节。但是,我似乎找不到这个信息的文档了。除此之外,如果您的UUID将作为键并且您计划使用CLUSTER选项,则需要注意PostgreSQL如何对表/索引进行聚集的影响。 - Bacon Bits