2009-09-21 6 views
1

다른 테이블 (아래 예제)의 데이터로 한 테이블의 데이터 하위 집합에 참여하려고하고 있으며 성능 관점에서 볼 때 가장 좋은 방법은 무엇이며 가장 확장 성이 뛰어난 것이 무엇인지 궁금합니다.어디에서 데이터를 조인하거나 where 절에 넣으시겠습니까?

내가 가입하려고하는 테이블은 다음과 같습니다 (다른 테이블은 이미 쿼리에 있음).

 
vid    kid   uid 
1    34   12 
1    34   15 
2    22   18 
2    34   18 
2    22   15 

내 쿼리 내가 좀 A는 곳으로 가입 혼합있어 것입니다 내가

 
SELECT * FROM similar 
RIGHT OUTER JOIN(SELECT event.stuff, eventdate.stuffshows 
FROM events 
JOIN evendate ON events.eid=eventdate.eid 
WHERE 
user.vid=events.vid AND user.uid=15 AND user.kid=22 
location= 'Paris' 
AND event.date 
BETWEEN '2009-08-14' 
AND '2009-08-17' 
GROUP BY event.date 
ORDER BY event.date 
LIMIT 0 , 5 
) mystuff ON event.bid = similar.id 
AND event.date=similar.date 

내 관심사에 그것을 만들 수 있다고 생각이

 
SELECT * FROM similar 
RIGHT OUTER JOIN(SELECT event.stuff, eventdate.stuffshows 
FROM events 
JOIN evendate ON events.eid=eventdate.eid 
WHERE location= 'Paris' 
AND event.date 
BETWEEN '2009-08-14' 
AND '2009-08-17' 
GROUP BY event.date 
ORDER BY event.date 
LIMIT 0 , 5 
) mystuff ON event.bid = similar.id 
AND event.date=similar.date 

같다. 성능면에서 user.vid = events.vid에 대한 두 번째 JOIN을 설정하는 것이 가치가 있습니까? 또는 조인이 아니라 WHERE를하는 것이 더 나은가?

이 문제에 대한 제안이 있으십니까?

+0

pedalpete : 나는 마지막 WHERE 절 (event.date = similar.date)에 의해 약간 벗어났습니다. 이 문을 OUTER JOIN 조건이나 하위 쿼리 자체로 이동하는 것이 좋습니다. 그대로 event.date가 외부 쿼리에 표시되어서는 안됩니다. –

답변

3

성능 차이가 있다면 가장 쉬운 방법은 SELECT 문에 EXPLAIN을 붙이는 것입니다. 어떤 색인이 사용되고 얼마나 많은 행을 만져야하는지 알 수 있습니다.

0

엄지 손가락의 규칙을 찾고 성능이 동등한 경우, 필자는이를 내 이해를 위해 가장 논리적으로 만드는 점을 사용합니다 . 조인을 정의하는 필드를 조인 절의 두 테이블과 where 절의 필터링 조건 사이에 넣습니다. 일반적으로 비슷한 쿼리를 작성하고 조인 조건을 동일하게 유지하고 where 절만 변경하면 올바른 결과를 얻을 수 있습니다.

0

이 질문에 직접 대답하십시오. 장기적으로 "where"또는 "on"절 내에 제한을 두는 것은 중요하지 않습니다. mySQL은 둘 다 효과적으로 동일한 쿼리를 실행하도록 최적화 할 것입니다 (dnagirl이 설명하는 것처럼 EXPLAIN을 사용하여 볼 수 있습니다). mysql workbench와 같은 도구는 질의를 실행하는 데 걸리는 상대적 시간을 보여줄 수 있으므로 이와 같은 질문에 답하는데도 도움이됩니다. 이 특정 쿼리의 경우 기본적으로 쿼리가 동일하기 때문에 Jay의 제안을 사용할 수 있으며 더 쉽게 읽을 수 있다고 생각하는 쿼리 만 사용할 수 있습니다.

관련 문제