![](http://closetoyou.co.kr/_var/simbol/admin.jpg)
semi join으로 인한 비효율을 제거.
MySQL 5.5 버전까지는 Semi Join(‘세미 조인’ 또는 ‘부분 조인’이라고 부름)의 성능이 최적화되어 있지 않았다
예를 들어 다음과 같은 경우다.
SELECT * FROM Country
WHERE
Continent = 'Europe' AND
Country.Code IN (SELECT City.country
FROM City
WHERE City.Population > 1*1000*1000);
서브쿼리 실행 후 WHERE 조건을 수행하는 것이 아니라 매번 데이터를 Nested Loop Join 탐색하면서 서브쿼리를 수행하기 때문에 불필요한 부하가 발생한다
오라클에 익숙한 사용자라면 IN 구문 안의 SELECT를 먼저 수행한 후 결과값을 해시 형식으로 만들어서 데이터를 처리한다고 예상할 것이다. 그러나 아쉽게도 MySQL에서는 Country 테이블의 Continent가 Europe인 조건 을 먼저 검색하고, 그 결과를 IN 조건의 서브쿼리를 일일이 반복 수행하며 최종 데이터를 가져온다.
SELECT Country.*
FROM Country
INNER JOIN City ON Country.Code = City.country
WHERE
Country.Continent = 'Europe'
AND City.Population > 1*1000*1000;
위와 같이 IN 내부에 있는 서브쿼리를 외부로 조인 형태로 변환하면 Semi Join에서처럼 반복적으로 City 테이블에 접근하여 데이터를 처리하지 않는다.
출처 : 한빛미디어 mysql performance 중 일부내용
![게시글을 twitter로 보내기 twitter](/_core/image/_public/sns_t1.gif)
![게시글을 facebook으로 보내기 facebook](/_core/image/_public/sns_f1.gif)
![게시글을 me2day로 보내기 me2day](/_core/image/_public/sns_m1.gif)
![게시글을 요즘으로 보내기 요즘](/_core/image/_public/sns_y1.gif)
![](/modules/bbs/theme/_pc/list01/image/ico_comment.gif)
번호 | 제목 | 글쓴이 | 조회 | 날짜 |
---|---|---|---|---|
11 | [MYSQL] 게시판 페이징(?) 속도 향상 [1] | 관리자 | 12868 | 2014.08.13 02:18 |
10 | [MYSQL] 페이징 쿼리, 페이징 기법 | 관리자 | 23401 | 2014.08.13 01:48 |
9 | [MYSQL] 이메일 필터 정규식 | 관리자 | 9283 | 2014.07.25 11:32 |
8 | [MYSQL] MYSQL EXPLAIN | 관리자 | 7058 | 2013.10.28 12:10 |
7 |
[MYSQL] mysql성능 향상
![]() |
관리자 | 5376 | 2013.10.07 12:52 |
6 | [MYSQL] mysql 최적화 | 관리자 | 6120 | 2013.10.07 12:35 |
>> | [MYSQL] semi join으로 인한 비효율을 제거. | 관리자 | 6701 | 2013.05.15 12:14 |
4 | [MYSQL] MYSQL DB튜닝 | 관리자 | 6547 | 2013.04.05 10:15 |
3 | [MYSQL] 자주쓰는 MYSQL | 관리자 | 5315 | 2013.04.05 10:14 |
2 | [MYSQL] DB생성+ 계정 셋팅 | 관리자 | 4079 | 2013.01.21 15:15 |
1 | [MYSQL] union order by | 관리자 | 4261 | 2013.01.21 14:24 |