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

Performance difference between UUID, CHAR, and VARCHAR in PostgreSql table?

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

当我创建 table 时,如果将 "id" 列定义为 VARCHAR(36), CHAR(36), or UUID 数据类型,后续写入或读取性能是否有任何差异?

谢谢!

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 提高性能。

使用uuid。 PostgreSQL 具有本机类型是有原因的。

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

不仅如此,还有:

  • uuid 对排序进行简单的字节排序。 textcharvarchar 考虑排序规则和区域设置,这对于 uuid 来说是无意义的。

  • uuid 只有一个规范表示。文本等则不同;你必须考虑大小写十六进制,是否存在 {...-...}s 等

毫无疑问。使用 uuid.

唯一有意义的其他类型是bytea,它至少可以用来直接存储uuid的16个字节。如果我使用的系统无法处理基本集之外的数据类型,比如某种非常愚蠢的 ORM,我就会这样做。

索引大小可能是最显着的差异:对于 VARCHAR,索引大小增加了近 86%。

从性能的角度来看,我没有注意到 PostgreSQL 9.5 中的显着差异。