postgres:通过 varchar 搜索,这是 java 中的枚举
Posted
技术标签:
【中文标题】postgres:通过 varchar 搜索,这是 java 中的枚举【英文标题】:postgres: search by varchar which is enum in java 【发布时间】:2020-06-30 20:22:21 【问题描述】:我有一个表,我在 varchar
列上查询。它可以是极少数可能的值之一(它是一个简单的 java 枚举)。
SQL:
SELECT *
FROM activation
WHERE registration = '1312313'
AND status = 'WORKING';
在这里我运行EXPLAIN ANALYZE EXECUTE
https://explain.depesz.com/s/Whuq,因为似乎问题在于按状态过滤。 registration
列上有一个索引。
在status
列上添加索引是否合理,或者在这里有点矫枉过正?如果是,我该如何优化给定的查询?
【问题讨论】:
【参考方案1】:对于此查询,您需要对出现在where
子句中的列进行复合 索引。将最严格的标准放在首位通常是个好主意(这里,我知道这是registration
):
create index activation_idx on activation(registration, status);
如果您总是过滤相同的 status
值,那么 a partial index 可能至少同样有效,而且成本更低:
create index activation_idx_partial
on activation(registration)
where status = 'WORKING';
【讨论】:
首先,从不知道部分索引,但我过滤了少数status
值。其次,它实际上取决于哪些标准更具限制性的数据。当registration
的初始过滤只返回几条记录时,它运行良好,但结果并非总是如此,这就是为什么我首先对它感到困惑。所以,我需要一个不依赖于谓词顺序的查询。可能复合索引将是一个解决方案。我是否需要删除旧的 registration
唯一索引?还是两个都可以?
@fasth:从技术角度来看,同时拥有两个索引是可以的(Postgres 会选择它喜欢的那个)。但归根结底,保留未使用的索引是没有意义的(它会消耗存储空间并且会在 DML 语句上为数据库带来更多工作) - 因此,除非您有另一个使用该索引的查询,否则只需删除它。
@GBM:根据***.com/questions/29217030/…这里的答案,如果registration
过滤非常有选择性,效率不会受到严重影响,我将在其他地方使用这个复合索引而不是普通的(create index activation_reg on activation(registration)
)?以上是关于postgres:通过 varchar 搜索,这是 java 中的枚举的主要内容,如果未能解决你的问题,请参考以下文章
使用 typeorm 在 postgres 中搜索数组中的项目