Postgresql “一个”中的博士后优化;A或存在(B)“;查询
我在我的Postgres优化中遇到了很多问题 基本上,我有三个表,它们将简化为:Postgresql “一个”中的博士后优化;A或存在(B)“;查询,postgresql,Postgresql,我在我的Postgres优化中遇到了很多问题 基本上,我有三个表,它们将简化为: Place:id、名称(字符串)、选择(布尔值) 书签:id、用户(整数)、位置(整数) 用户:id、名称(字符串) Place表有数百万行(并且还在增长),但其中相对较少的行将select设置为true 我在这些表上有几个索引,显然是在所有id上,加上位置上的部分索引,其中“select”=true,以及书签(user,place)组合上的唯一索引。还有更多,但我认为它们与这里无关 当我执行以下类型的查询时:
:id、名称(字符串)、选择(布尔值)Place
:id、用户(整数)、位置(整数)书签
:id、名称(字符串)用户
Place
表有数百万行(并且还在增长),但其中相对较少的行将select
设置为true
我在这些表上有几个索引,显然是在所有id
上,加上位置上的部分索引,其中“select”=true
,以及书签(user,place)组合上的唯一索引。还有更多,但我认为它们与这里无关
当我执行以下类型的查询时:
SELECT *
FROM place
WHERE "select"
LIMIT 10;
SELECT *
FROM place
WHERE exists (SELECT id
FROM bookmark
WHERE user IN (1,2,3,4)
AND bookmark.place = place.id)
LIMIT 10;
需要3毫秒
当我执行以下类型的查询时:
SELECT *
FROM place
WHERE "select"
LIMIT 10;
SELECT *
FROM place
WHERE exists (SELECT id
FROM bookmark
WHERE user IN (1,2,3,4)
AND bookmark.place = place.id)
LIMIT 10;
它也燃烧得很快
但是,如果我在这两种情况下都执行或
,例如:
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秒以上
除了在我的代码中执行两个查询并合并结果外,还有什么方法可以优化这个问题吗?旧问题
使用联合
:
(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;
谢谢你的链接!