【问题标题】:Postgres - Index with multiple where clausesPostgres - 具有多个 where 子句的索引
【发布时间】:2020-04-27 12:20:42
【问题描述】:

我有一个包含两个 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)

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

【问题讨论】:

    标签: postgresql indexing


    【解决方案1】:

    假设user.id 真的是userid,那么完美的索引应该是

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

    这对于内部查询来说是完美的,而索引对于外部查询也有好处。

    在此基础上,以上假设所有这些条件都是选择性的,也就是说,它们显着减少了结果行数。

    在您的情况下,条件mm.source IN :sources 似乎不是非常有选择性,可能是因为该列只有很少的不同值,或者因为您碰巧查询了发生的值经常。

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

    【讨论】:

    • 为什么会导致嵌套循环?内部查询不使用任何外部值,最多返回一个结果。
    • @Bergi 你会说这仍然是最好的选择吗?
    • @gozluklu_marti 除非您有多个具有相同时间戳的媒体,否则我可能会使用not use a nested query。我总是会进行基准测试,并建议查看EXPLAIN ANALYZE
    • @LaurenzAlbe 如果您阅读了我更新的问题,根据 Postgres,您的索引不是最好的 :)
    • 我已经为此添加了解释。原因是条件的选择性,我不知道。
    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多