从 Postgres 13 开始,哈希索引是不是最适合精确文本匹配查询?

Posted

技术标签:

【中文标题】从 Postgres 13 开始,哈希索引是不是最适合精确文本匹配查询?【英文标题】:Are hash indexes the most optimal for exact text match queries as of Postgres 13?从 Postgres 13 开始,哈希索引是否最适合精确文本匹配查询? 【发布时间】:2021-08-14 00:38:23 【问题描述】:

示例(假)案例:索引包含电子邮件(文本类型)的列,当该列将专门查询精确字符串匹配时,例如。

SELECT * FROM mytable WHERE email = 'test@test.com'

在这些情况下,哈希索引是否提供了优于 B-TREE 而没有缺点的优势?

它们对插入/更新的性能有不同的影响吗?

(编辑:从未按此列排序)

【问题讨论】:

【参考方案1】:

唯一明显的优点是要索引的文本字符串可以很长。然后哈希索引可以小得多,因此可以更好地缓存。在极端情况下,插入长度超过大约 2700 字节的值可能会与 btree 索引一起出错,但仍适用于哈希索引。

对于较短的字符串,哈希索引的缺点多于优点。除了不支持排序之外,它们也不支持唯一约束(因此不能在外键的接收端),并且在非唯一方面,如果某些值非常常见,它们往往会变得不平衡比其他值。此外,使用较少意味着它们的测试较少,因此更有可能存在未发现的错误;优化它们的工作量也减少了。

另外,我认为哈希索引的元页面仍然是插入的争论点,这会降低性能。

【讨论】:

【参考方案2】:

如果你只是用相等运算符比较 email 列并且没有排序,那么哈希索引要快得多。

B-trees 可以处理对可以排序为某种顺序的数据的相等和范围查询。特别是,当索引列涉及使用以下运算符之一的比较时,PostgreSQL 查询计划器将考虑使用 B-tree 索引:=、>

哈希索引只能处理简单的相等比较。每当使用 = 运算符进行比较时,查询计划器将考虑使用哈希索引。

这是 mysql 文档中两种索引类型的比较,但也适用于 postgresql MySQl Comparison of B-Tree and Hash Indexes

【讨论】:

以上是关于从 Postgres 13 开始,哈希索引是不是最适合精确文本匹配查询?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:强制分析器使用位图扫描而不是索引扫描

为 Postgres 分区创建自定义哈希运算符

当列值是 84 字节文本字段时,postgres 中保持列唯一的最有效方法是啥?

这个 Postgres 查询不是最优的吗?

哈希函数的本质及生成方式

MySQL索引