[MySql] Join vs Sub Query 비교

MySQL 5.5에서 5.6으로 업데이트가 되면서 서브쿼리(Subquery) 성능 개선이 많이 이루어졌습니다.

이번 시간에는 MySQL 2개의 버전 (5.5, 5.6) 에서 서브쿼리를 통한 조회 (Select)와 Join에서의 조회간의 성능 차이를 비교해보겠습니다.

MySQL의 정석과도 같은 Real MySQL 책이 MySQL 5.5 버전을 기준으로 하다보니 5.6 변경분에 대해서 별도로 포스팅하게 되었습니다.

0. 테스트 환경

테스트용 테이블은 2개를 만들었습니다.

  • 메인 테이블 100만건
  • 서브 테이블1 (인덱스 O) 1000건
  • 서브 테이블2 (인덱스 X) 1000건


본문내용은 링크를 참고해 주세요. 



MySQL 5.6 에서 많은 서브쿼리가 최적화 되었지만, 그럼에도 불구하고 모든 서브쿼리가 최적화 된 것은 아닙니다.
아래 조건들은 MySQL의 서브쿼리 최적화가 적용 되는 조건들입니다.

  • IN(subquery) 또는 = ANY(subquery) 형태
  • UNION 없는 단일 SELECT
  • 집계함수 와 HAVING 절을 가지지 말아야
  • 서브쿼리의 WHERE 조건이 외부쿼리의 다른 조건과 AND 로 연결
  • 조인을 사용한 UPDATE 나 DELETE 가 이니어야
  • 미리 수립된 실행계획을 사용하지 않는 경우(PreparedStatement 사용시 실행계획 재사용됨)
  • 외부쿼리와 서브쿼리가 실제 테이블 사용(가상 테이블 사용시 세* 미조인 최적화 안됨)
  • 외부쿼리와 서브쿼리가 straight_join 힌트 미사용

결론

  • MySQL 5.5 까지는 서브쿼리 최적화가 최악이라 웬만하면 Join으로 전환하자
    • 메인테이블의 row 수 만큼 서브 쿼리를 수행한다
  • MySQL 5.6 에서 서브 쿼리가 대폭 최적화 되었다.
    • 다만 최적화가 적용 안되는 조건들이 다수 존재한다
  • 버전/조건 관계 없이 좋은 성능을 내려면 최대한 Join을 이용하자
  • Join을 사용하기가 너무 어렵다면 Subquery는 사용하되, MySQL 5.5 이하라면 절대 사용하지 않는다.
    • 차라리 쿼리를 나눠서 2번 실행 (메인쿼리/서브쿼리)하고 애플리케이션에서 조립하는게 낫다.
0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기
captcha
자동등록방지 숫자입력

웹개발

번호 제목 글쓴이 날짜 조회수
22 [리눅스] Apache Document Root 권한설정 최고관리자 09-04 1,626
21 [리눅스] CentOS Version 확인하기 최고관리자 09-04 1,462
20 [리눅스] MySQL 최초 접속 및 설정 최고관리자 09-03 1,754
19 [리눅스] MySQL 5.7 보안설정 최고관리자 09-03 1,551
18 [리눅스] RDate로 시간 동기화 하기. 최고관리자 09-03 1,476
17 [리눅스] 기본설치 (Apache , PHP , MySql) 최고관리자 09-03 2,032
16 [공부] 프로그래밍 공부 사이트 최고관리자 09-01 1,407
15 [기능] Mobile 메뉴 최고관리자 09-01 1,374
14 [기능] Mega Menu 최고관리자 09-01 1,422
13 [기능] 상단에서 메뉴높이가 높고 아래로 스크롤하면 메뉴높이가 줄어듦 최고관리자 09-01 1,426
12 [기능] 상단에 메뉴가 보이다가 아래로 스크롤하면 메뉴가 사라지고 상단으로 가면 메뉴가 보임. 최고관리자 09-01 1,344
11 [기능] 메뉴가 안 보이다가 아래로 스크롤하면 메뉴가 생김 최고관리자 09-01 1,447
10 [기능] Icon으로 구성된 수직/수평 메뉴 최고관리자 09-01 1,292
9 [JS] 자바스크립트 {...} [...] 문법 (비구조화 할당/구조분해 할당) 최고관리자 09-01 1,301
8 [기능] 상단의 높이가 큰 메뉴상태에서 아래로 스크롤하면 상단에 높이가 낮은 메뉴가 고정됨 최고관리자 09-01 1,304
7 [Font] Naversoftware 폰트 리스트 최고관리자 09-01 1,368
6 [Web Font] 직접입력해서 폰트를 확인할 수 있는 사이트 최고관리자 09-01 1,358
5 [CSS - font] unicode-range 최고관리자 08-31 1,585
4 [UI 참고] Oven - 회원가입 최고관리자 08-31 1,321
3 타자기체 - 가로 세로 비율이 고정되어 있는 글꼴로 표현 최고관리자 08-08 1,410