2012-07-04 3 views
1

3 개의 테이블, 사용자 테이블, 약 500 개의 서로 다른 항목의 테이블 및 해당 조인 테이블이 있습니다. 내가 뭘하고 싶은 것입니다 : 대신 IN 조건, 내가 모든 해당 항목이 사용자를 찾을 싶습니다다 대 다 관계의 조건

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; 

, 제외. 도움이된다면 한 번에 검색 할 수있는 항목의 최대 개수는 5가 될 것이라고 가정하십시오. 또한 읽기 전용 시스템이고 속도가 가장 빠르기 때문에 도움이된다면 Postgres를 사용하고 있습니다. 우선 순위.

답변

0

관계 분할의 또 다른 경우입니다. 우리는이 종류의 문제를 다루기 위해 많은 질문 모음을 모았습니다 here.

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; 

그것은 내 테스트에서 가장 빠른 중 하나였습니다 만 user에서 열을 반환하는 동안은 items_users에 다양한 기준의 요구 사항에 맞는 :이 경우

, 5 개 이상의 항목, 내가 시도 할 수 있습니다.

indexes at the linked answer을 읽으십시오. 이는 성능에 결정적입니다. 테이블은 읽기 전용이므로 방문해야하는 페이지 수를 최소화하기 위해 두 테이블 모두 CLUSTER입니다. 그 밖의 것이 없다면 (user_id, item_id)에서 다중 컬럼 인덱스를 사용하는 CLUSTER items_users.

+0

도움 주셔서 감사합니다. –