2017-05-03 9 views
0

큰 테이블 두 개에 모두 venue_id이있는 큰 테이블이 있습니다. 두 개의 독립적 인 값이므로 외래 키가 아닙니다. 그들은 다음과 같습니다 :큰 테이블 쿼리 MySQL을 통해 두 테이블에 걸쳐 어디서나

table: activity_retail 
columns: activity_id, venue_id, created_at 
indexes: activity_id (PRIMARY), (activity_id, venue_id) INDEX 


table: activity 
columns: activity_id, item_id, venue_id, created_at 
indexes: activity_id (PRIMARY), (created_at) INDEX 

내가 venue_id 각 테이블에 X에 해당하는 모든 활동, 둘 다에 걸쳐 쿼리를 수행하고 싶습니다. 그래서 내가 할 것이다 :

SELECT * from activity 
    LEFT JOIN activity_retail on activity_retail.activity_id = activity.activity_id 
    WHERE activity_retail.venue_id = X or activity.venue_id = X 
ORDER BY activity_retail.created_at desc LIMIT 0, 25 

나는 또한 페이지 매기기에이 쿼리를 수행해야 할 수 있습니다 :

SELECT * from activity 
    LEFT JOIN activity_retail on activity_retail.activity_id = activity.activity_id 
    WHERE activity_retail.venue_id = X or activity.venue_id = X and activity.activity_id > Y 
ORDER BY activity_retail.created_at desc LIMIT 0, 25 

상황이 (가) 존재하지 않을 수 activity_idactivity_retail에, 그것은 선택 필드입니다, 그래서 내가 할 수있는 ' 내부 조인은 왼쪽 조인이어야합니다. 여기

EXPLAIN입니다 :

1 PRIMARY activity index ix_ivi_created created_at 8 NULL 25 Using where 
1 PRIMARY activity_retail eq_ref PRIMARY PRIMARY 4 activity.activity_id 1 

이 (EXPLAIN에 따라) 작은 쿼리이지만, 그것을 실행하는 데 시간이 오래 걸리고, EXTRAS 지역에 아무것도 사용하지 않습니다.

이 방법을 올바르게 수행하는 방법에 대한 조언 - 기본적으로 문을 사용하여 두 테이블에 걸쳐 WHERE 조건? AND은 실제로 잘 작동하지만 여기에 OR이 필요합니다.

+0

당신이 그래서 우리는하지만 "venue_id 각 테이블에 X 같다 여기서"당신의 인덱스? 또한 – ghenghy

+0

, 당신은 말을 볼 수있는 테이블에 설명 제공 할 수 있습니다 어떤 테이블에서 venue_id가 X와 같은지 쿼리가 이루어지고 있습니다. – ghenghy

+0

일부 샘플 데이터와 원하는 결과가 도움이 될 것입니다. – ghenghy

답변

0

왼쪽 결합에 매우 가까운 것으로 보입니다. 그러나 소매 테이블에 대한 조건을 WHERE 절로 이동 시키면 즉시 내부 조인이 수행됩니다. 다음을 시도하십시오 ...

SELECT 
     A.*, 
     AR.* 
    from 
     activity A 
     LEFT JOIN activity_retail AR 
      on A.activity_id = AR.activity_id 
      AND AR.Venue_ID = X 
    WHERE 
      A.Venue_ID = X 
     OR NOT AR.Activity_ID IS NULL 
    ORDER BY 
     AR.created_at desc 
    LIMIT 
     0, 25 

알림 "AR.Venue_ID = X"를 JOIN 절로 이동 시켰습니다. 이렇게하면 보조 테이블에 "X"가있는 경우에만 일치하며, 그렇지 않으면 항상 null이됩니다.

이제 Where 절이 Venue_ID 또는 AR_ActivityID에 대한 활동 테이블 (항상 레코드 테스트)에 대한 테스트가 NULL이 아닙니다 (적절한 장소가있는 테이블의 레코드를 의미하므로 DOES가 결과 집합.

는 희망이 당신이 찾고있는 않습니다.

+0

슬프게도 - 작동하지 않거나 모든 인덱스를 올바르게 사용하면 전체 테이블 스캔입니다. – gregavola