Chr*_*ice 38 postgresql performance index index-tuning query-performance
我正在使用 PostgreSQL (9.4) 数据库在 Ruby on Rails 中开发应用程序。对于我的用例,表中的列将被非常频繁地查找,因为应用程序的重点是在模型上搜索非常具体的属性。
我目前正在决定是对列使用integer类型还是简单地使用典型的字符串类型(例如character varying(255),这是 Rails 中的默认值),因为我不确定索引上的性能差异是什么。
这些列是 enums。对于它们可以拥有的可能值的数量,它们具有固定的大小。大多数枚举长度不超过 5,这意味着索引在应用程序的整个生命周期中或多或少是固定的;因此,整数和字符串索引在节点数上是相同的。
但是,将被索引的字符串可能有大约 20 个字符长,在内存中大约是整数的 5 倍(如果一个整数是 4 个字节,并且字符串是纯 ASCII 每个字符 1 个字节,那么这成立)。我不知道数据库引擎如何进行索引查找,但是如果它需要“扫描”字符串直到它完全匹配,那么本质上这意味着字符串查找将比整数查找慢 5 倍;整数查找匹配之前的“扫描”将是 4 个字节而不是 20 个。这就是我的想象:
查找值为(整数)4:
扫描………………………………………………………………………………………………………………………………………… 正在获取记录... |BYTE_1|BYTE_2|BYTE_3|BYTE_4|BYTE_5|BYTE_6|BYTE_7|BYTE_8|...|
查找值是(字符串)“some_val”(8 个字节):
扫描................................................. …………………………………………………………………………………………………………………………………………………………………… 正在获取记录... |BYTE_1|BYTE_2|BYTE_3|BYTE_4|BYTE_5|BYTE_6|BYTE_7|BYTE_8|...|
我希望这是有道理的。基本上,因为整数占用更少的空间,它可以比它的字符串对应物更快地“匹配”。也许这是一个完全错误的猜测,但我不是专家,所以这就是我问你们的原因!我想我刚刚找到的这个答案似乎支持我的假设,但我想确定一下。
列中可能值的数量在使用任何一个时都不会改变,因此索引本身不会改变(除非我向枚举添加了一个新值)。在这种情况下,使用integeror会有性能差异varchar(255),还是使用整数类型更有意义?
我问的原因是 Rails 的enum类型将整数映射到字符串键,但它们并不是面向用户的列。本质上,您无法验证枚举值是否有效,因为无效值会ArgumentError在运行任何验证之前导致。使用string类型将允许验证,但如果存在性能成本,我宁愿绕过验证问题。
Erw*_*ter 45
简短的回答:integer比varchar或text在各个方面都快。对于小桌子和/或短键来说无关紧要。差异随着键的长度和行数的增加而增加。
字符串 ... 20 个字符长,在内存中大约是整数的 5 倍(如果整数是 4 个字节,并且字符串是纯 ASCII,每个字符 1 个字节,那么这成立)
准确地说,字符类型 ( textor varchar)在磁盘上的 20 个 ASCII 字符正好占用21个字节,在 RAM 中占用23个字节。详细评估:
同样重要的是:COLLATION规则可以使字符数据排序更昂贵 - 与数字数据类型不同:
在大多数情况下,索引大小可能是造成性能差异的最大原因。考虑每个索引元组的开销(与表基本相同):4 个字节用于项目标识符,8 个字节用于索引元组标头。因此,索引元组integer将达到20 个字节(包括 4 个字节的对齐填充),对于varchar(20)20 个 ASCII 字符,它将是36 个字节(也包括填充)。细节:
抛开所有理论:最好只是测试:
Postgres 9.5引入了对长字符串数据(关键字“缩写键”)进行排序的优化。但是 Linux 上某些 C 库函数中的一个错误迫使该项目在 Postgres 9.5.2 中禁用非 C 校对的功能。发行说明中的详细信息。
但是,如果您实际使用 Postgresenum类型,那么大多数这些考虑因素都是无关紧要的,因为integer无论如何这些都是在内部使用值实现的。手册:
一个
enum值在磁盘上占用四个字节。
旁白:varchar(255)用于早期版本的 SQL Server,它可以在内部使用更高效的数据类型,最多 255 个字符。但是 255 个字符的奇数长度限制在 Postgres 中根本没有特殊意义。
| 归档时间: |
|
| 查看次数: |
33475 次 |
| 最近记录: |