gpt4 book ai didi

postgresql - Postgres 在 "A OR exists(B)"查询中优化

转载 作者:行者123 更新时间:2023-11-29 12:39:38 31 4
gpt4 key购买 nike

我在优化 Postgres 时遇到了很多问题。

基本上,我有三个表,它们将简化为:

  • 放置:id, name (String), select (Boolean)
  • Bookmark: id, user (Integer), place (Integer)
  • 用户: id, name (String)

Place 表有数百万行(并且还在增加),但其中相对较少的行将 select 设置为 true。

我在这些表上有几个索引,显然在所有 id 上,加上部分索引在 place where "select"=true 上,还有一个唯一索引在 书签(用户、地点)组合。还有更多,但我认为它们与这里无关。

当我进行以下类型的查询时:

SELECT * 
FROM place
WHERE "select"
LIMIT 10;

需要 3 毫秒。

当我进行以下类型的查询时:

SELECT * 
FROM place
WHERE exists (SELECT id
FROM bookmark
WHERE user IN (1,2,3,4)
AND bookmark.place = place.id)
LIMIT 10;

它的速度也非常快。

但是,如果我在两种情况下都执行 OR,如下所示:

SELECT * 
FROM place
WHERE "select"
OR exists (SELECT id
FROM bookmark
WHERE user IN (1,2,3,4)
AND bookmark.place = place.id)
LIMIT 10;

它减慢到超过 1 秒。

除了在我的代码中执行两个查询并合并结果之外,还有什么方法可以优化它吗?

最佳答案

老问题,OR is a performance killer .

使用UNION:

(SELECT * FROM place
WHERE select
LIMIT 10)
UNION
(SELECT * FROM place
WHERE exists (SELECT 1 FROM bookmark
WHERE user IN (1,2,3,4)
AND bookmark.place = place.id)
LIMIT 10)
LIMIT 10;

关于postgresql - Postgres 在 "A OR exists(B)"查询中优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57591238/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com