본문 바로가기
Database/MYSQL

join 설명

by 반화넬 2007. 6. 4.
반응형
그런데 a LEFT JOIN b on a.id=b.id limit 10라고 할때 a쪽 테이블은 전부 읽어들이고 b쪽 테이블 중 id가 a.id와 같은 것만 조인시켜서 결과를 내주는 것 같던데.. 맞나요???
 
그러니까 a 테이블에 100만건의 자료가 있다면 실제로 limit 를 사용해도 내부적으로 100만건을 전부 뒤지는것 같더라구요... 일단 첫번째 질문은 "그런가요? 100만건을 다 뒤지나요?" 입니다.
 
두번째로.. 위와 같은 쿼리에서 a LEFT JOIN b on a.id=b.id where a.group_id = 10 limit 10 이런식으로 질의한다면 a 테이블의 100만건을 전부 처리하지 않고 where 조건인 group_id가 10인 값만 선택적으로 조인시킬텐데... 그게 limit 10의 영향을 받나요? 그러니까 group_id가 10인 항목이 1000건이 있다면 내부적으로는 1000건을 전부 검색하고 실제로 결과를 출력할 때 limit에서 10개만 잘라주나요 아니면 where 조건을 찾아볼 때 limit 10 의 영향으로 10개만 검색을 하나요... 이게... 두번째 질문입니다...
 
사실 제가 동일한 질의를 right join을 사용해서
a RIGHT JOIN b on a.id=b.id where a.group_id = 10 limit 10 이렇게 수행해본 결과로는 left join을 사용한 위의 쿼리는 limit 10에 관계없이 1000건을 다 뒤지는것 같습니다.. 그렇다면 이렇게 right join을 할 때는 where 조건값이 1000건이지만 이 중 상위 10건만 검색하게 되는건가요? 그래서 더 빠른건가요? 이게 세번째 질문입니다. T_T
 
그리고 마지막으로!!! 그렇다면 inner join을 사용했을 때..
a INNER JOIN b on a.id=b.id where a.group_id = 10 limit 10
 
이렇게 한다면 이건 내부적으로 바로 위의 right join과 동일한 방식으로 검색되나요? 아니면.. 이것 역시 a 테이블의 1000건을 검색한 뒤 b 테이블과의 on 조건에 맞춰 10개만 잘라서 출력해주는 건가요.... 이게 마지막 질문입니다.
 
 
---- > 질문에대한 답변
 
 
 
join 이란 두개이상의 테이블을 가지고 연산을 하는겁니다.
수학의 집합연산과 같이 생각하시면 쉽습니다.
inner join 혹은 natural join 은 교집합에 해당하며, outer join 은 합집합에 해당합니다.. (union 이 정확한 합집합이지만 union 이 row 의 합집합이라면 outer join 은 column 의 합집합이라 할 수 있겠죠.. 있으면 가져오고 없으면 널값으로 채우는 겁니다.)
left join , right join 의 정확한 명칭은 left outer join, right outer join 입니다.
또한 질문에서 헷갈리시는 부분은 쿼리수행에서 where 이 적용되는 시점과 limit 이 적용되는 시점을 혼동하시는것 같습니다.
where 은 조인을 수행하면서 함께 적용되고 limit 은 조인결과가 생성되는 시점에서 적용됩니다.
 
1. 맞습니다. 그러나 100만건을 다 뒤지지는 않습니다.
If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count lines rather than sorting the whole table.
As soon as MySQL has sent the required number of rows to the client, it aborts the query unless you are using SQL_CALC_FOUND_ROWS.
 
2. 순차적으로 조인을 해나가다 결과행이 10개가 되면 멈추겠죠.
 
3. 마찬가지입니다.  조인연산을 하는중에 10개가 되면 멈추겠죠.
 
4. inner join 은 교집합입니다.  outer join 에서 한쪽 테이블은 모두 나와야 되니 인덱스를 사용하건 말건 한쪽 테이블은 풀스캔이겠죠..(인덱스가 있으면 빨라지긴 하겠지만..) 하지만 inner join 은 교집합이니 a 와 b 를 비교해서 행수가 더 적은걸 기준으로 하겠죠. a 가 10000 건이고 b 가 100 건이라면 b 를 스캔하는게 더 빠르겠죠. b 의 각 행에 대해 매치되는 a 가 있는지 확인하면 되니까. where 조건이 있다면 스캔해야할 수는 더 적어질테고요..
마찬가지로 결과행이 limit 수가 된다면 멈추겠죠..
 
 
추가 :
join on 다음에선 조인 조건이구요
where 다음에선 조인한 결과에 거는 조건입니다.
반응형