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
对排序进行简单的字节排序。 text
、char
和 varchar
考虑排序规则和区域设置,这对于 uuid 来说是无意义的。
uuid
只有一个规范表示。文本等则不同;你必须考虑大小写十六进制,是否存在 {...-...}
s 等
毫无疑问。使用 uuid
.
唯一有意义的其他类型是bytea
,它至少可以用来直接存储uuid的16个字节。如果我使用的系统无法处理基本集之外的数据类型,比如某种非常愚蠢的 ORM,我就会这样做。
索引大小可能是最显着的差异:对于 VARCHAR,索引大小增加了近 86%。
从性能的角度来看,我没有注意到 PostgreSQL 9.5 中的显着差异。
我将 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
对排序进行简单的字节排序。text
、char
和varchar
考虑排序规则和区域设置,这对于 uuid 来说是无意义的。uuid
只有一个规范表示。文本等则不同;你必须考虑大小写十六进制,是否存在{...-...}
s 等
毫无疑问。使用 uuid
.
唯一有意义的其他类型是bytea
,它至少可以用来直接存储uuid的16个字节。如果我使用的系统无法处理基本集之外的数据类型,比如某种非常愚蠢的 ORM,我就会这样做。
索引大小可能是最显着的差异:对于 VARCHAR,索引大小增加了近 86%。
从性能的角度来看,我没有注意到 PostgreSQL 9.5 中的显着差异。