Postgresql中的文本相等运算符性能

时间:2016-09-14 12:26:37

标签: postgresql data-structures hash

此查询如何在字符串比较性能方面起作用(假设last_name上有标准的B树索引?

select * from employee where last_name = 'Wolfeschlegelsteinhausenbergerdorff';

因此当它走B-Tree时,我假设它没有对last_name字段中的每个字符进行线性搜索。 EG,它没有开始检查第一个字母是以W开头的......假设它没有进行线性比较,它会做什么?

我问,因为我正在考虑编写自己的重复预防机制,但我希望性能合理。我原本想要通过API散列每个字符串(进入一些原始数据类型,可能是Long),并将哈希码存储在一个集合/缓存中(每个条目在5分钟后过期)。任何冲突都会/可能会提示真正的重复检查,其中已处理的字符串存储在postgresql中。但是我在想,只是简单地查询postgresql会更好,而不是维持我自己的基于内存的哈希集合,它会在5-10分钟之后剔除旧条目。我可能会使用redis来实现可伸缩性,因为多个节点将读取不同的流。我的内存缓存哈希码是否比查询索引的postgres字符串列(全文匹配而不是文本搜索)更快?

1 个答案:

答案 0 :(得分:1)

比较字符串是否相等时,调用函数texteq

如果在src/backend/utils/adt/varlena.c中查找该函数,您会发现使用C库函数memcmp进行比较。我怀疑你能比这更快。

当您在B树索引中查找值时,它将与从根页面到叶子页面的每个索引页面中存储的值进行比较,最多为5或6页。

坦率地说,我怀疑你能比这更快,但我祝你好运。