小编Chr*_*ice的帖子

索引:如果节点数相同,则整数与字符串性能

我正在使用 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类型将允许验证,但如果存在性能成本,我宁愿绕过验证问题。

postgresql performance index index-tuning query-performance

38
推荐指数
1
解决办法
3万
查看次数