1

3つのテーブル、ユーザーのテーブル、約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

これは、関係除算のもう1つのケースです。ここでは、このクラスの問題に対処するためのクエリのかなりの武器を集めました。

この場合、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これは私のテストで最速の1つであり、から列を返すだけで、複数の基準の要件に適合しますuser

リンクされた回答でインデックスについて読んでください。これらはパフォーマンスにとって非常に重要です。テーブルは読み取り専用なので、CLUSTERアクセスする必要のあるページ数を最小限に抑えるために、両方のテーブルも使用します。他に何もない場合は、クラスターitems_usersで複数列のインデックスを使用し(user_id, item_id)ます。

于 2012-07-04T17:52:34.950 に答える