1

假设我有三个表,一个用户表,一个包含大约 500 个不同项目的表,以及相应的连接表。我想做的是:

select * from users u join items_users iu on iu.user_id = u.id
where iu.item_id in (1,2,3,4,5)
and u.city_id = 1 limit 10;

除了IN条件之外,我想找到拥有所有相应项目的用户。如果有帮助,假设一次搜索的最大项目数为 5。此外,我正在使用 Postgres,如果有帮助,请不要介意对其进行非规范化,因为它是只读系统并且速度最高优先。

4

1 回答 1

0

这是关系分裂的另一种情况。我们在这里收集了相当多的查询来处理这类问题

在这种情况下,如果有 5 个或更多项目,我可能会尝试:

SELECT u.*
FROM   users AS u
WHERE  u.city_id = 1
AND EXISTS (
   SELECT *
   FROM   items_users AS a
   JOIN   items_users AS b USING (user_id)
   JOIN   items_users AS c USING (user_id)
   ...
   WHERE  a.user_id = u.user_id
   AND    a.item_id = 1
   AND    b.item_id = 2
   AND    c.item_id = 3
   ...
   )
LIMIT 10;

它在我的测试中是最快的,它符合多个条件的要求,items_users同时仅从user.

阅读链接答案中的索引。这些对性能至关重要。由于您的表格是只读的,我也会同时CLUSTER使用这两个表格,以尽量减少必须访问的页面数量。如果不出意外,CLUSTERitems_users(user_id, item_id).

于 2012-07-04T17:52:34.950 回答