Postgres-具有多个where子句的索引

gozluklu_marti

我有一个包含两个WHERE子句的查询。看起来像这样:

SELECT m 
FROM Media m 
WHERE m.userid = :id 
  AND m.timestamp = (SELECT MAX(mm.timestamp) 
                     FROM Media mm 
                     WHERE mm.userid = :id 
                       AND mm.source IN :sources 
                       AND mm.timestamp < :date)

我想知道该查询使用一个索引会更快还是应该为每个WHERE子句创建两个单独的索引喜欢:

  • 第一个索引 WHERE = (userid, timestamp)
  • 第二指数第二指数 WHERE = (userid, source, timestamp)

编辑:

我创建了2个索引。

  • 1- (userid, source, timestamp)
  • 2- (userid, timestamp)

当我分析查询时,它总是显示用于查询的第二个索引。

劳伦兹·阿尔伯

假设user.id确实如此userid,则理想的指标是

CREATE INDEX ON media(userid, source, timestamp);

这对于内部查询是完美的,而索引对于外部查询也非常有用。

进一步地,上面假设所有这些条件都是选择性的,也就是说,它们显着减少了结果行的数量。

根据你的情况,似乎病情mm.source IN :sources不是非常有选择性的,也许是因为有列只有少数不同的值,或因为你碰巧查询对于频繁发生的值。

在这种情况下,最好从索引中省略该列,因为这将使索引变小而不会造成太大损失。在其他所有条件相同的情况下,PostgreSQL将选择扫描较小的索引。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有许多值的Postgres IN子句未使用部分索引

具有十六进制值的Golang + Postgres WHERE子句

两个表中带有where子句的内部联接的Postgres索引

where 子句 postgres 中的 JSONB

postgres CASE 和 where 子句

为什么 Postgres 更喜欢 seq 扫描而不是具有明确 where 条件的部分索引?

Postgres:选择具有多个帐户的用户

Postgres:具有可选“ WHERE”参数的函数

在Postgres中的“具有”子句中从Oracle转换rownum

使用具有不同 order by 子句的 postgres 窗口函数

Postgres SQL WHERE子句在模式匹配中带有“ OR”

使用可以具有多个值的where查询时出现Grafana Postgres错误

具有多个条件的Where子句

mysql强制在具有“或”的“ where”子句中使用多个索引

Cassandra:具有多个WHERE子句的查询的二级索引

Postgres在具有OVER子句的查询中报告“窗口函数调用需要OVER子句”

Postgres:具有值的复合唯一索引

仅具有整数组合的Postgres索引

在Postgres WHERE子句中使用IF语句

Postgres where子句比较时间戳

如何使用WHERE子句一次将多个值插入Postgres表中

在Postgres中的JSON中查询具有多个值

具有多个架构和用户的连接池Postgres

Postgres 从具有多个值的 select 语句插入

如何引用具有多个主键的 postgres 表

Postgres分组依据并提取具有多个元素的分组

具有多个空可能性的 Postgres COPY

在单个postgres表中生成多个索引

Postgres 11执行计划-查询where子句中没有分区键的分区表