从 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 开始,哈希索引是不是最适合精确文本匹配查询?的主要内容,如果未能解决你的问题,请参考以下文章