• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 1. 최적화 개요
    2. SQL문 최적화
    1. SELECT문 최적화
    1. SELECT문 속도
    2. MySQL WHERE절 최적화 방법
    3. range 최적화
    4. 인덱스 병합 최적화
    5. 엔진 조건문 푸시 다운 최적화
    6. 인덱스 조건문 푸시 다운 최적화
    7. 인덱스 확장의 사용
    8. IS NULL 최적화
    9. LEFT JOIN과 RIGHT JOIN 최적화
    10. Nested Loop 조인 알고리즘
    11. 중첩 된 결합의 최적화
    12. 외부 조인의 단순화
    13. Multi-Range Read 최적화
    14. Block Nested Loop 조인과 Batched Key Access 결합
    15. ORDER BY 최적화
    16. GROUP BY 최적화
    17. DISTINCT 최적화
    18. 서브 쿼리의 최적화
    19. LIMIT 쿼리의 최적화
    20. 풀 테이블 스캔을 피하는 방법
    2. DML문 최적화
    3. 데이터베이스 권한 최적화
    4. INFORMATION_SCHEMA 쿼리 최적화
    5. 기타 최적화 Tips
    3. 최적화 및 인덱스
    4. 데이터베이스 구조의 최적화
    5. InnoDB 테이블의 최적화
    6. MyISAM 테이블의 최적화
    7. MEMORY 테이블 최적화
    8. 쿼리 실행 계획의 이해
    9. 버퍼링과 캐시
    10. 잠금 작업의 최적화
    11. MySQL 서버의 최적화
    12. 성능 측정
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

8.2.1.12 외부 조인의 단순화

쿼리의 FROM 절에서 테이블 식은 종종 단순화됩니다.

파서 단계에서 오른쪽 외부 조인 작업을 포함 쿼리는 왼쪽 조인 연산만을 포함 동일한 쿼리로 변환됩니다. 일반적인 경우, 변환은 다음 규칙에 따라 실행됩니다.

 (T1, ...) RIGHT JOIN (T2, ...) ON P (T1, ..., T2, ...) =
 (T2, ...) LEFT JOIN (T1, ...) ON P (T1, ..., T2, ...)

형식 T1 INNER JOIN T2 ON P(T1,T2) 의 모든 내부 조인 수식은 WHERE 조건 (또는 포함 된 결합의 결합 조건이 있으면 그것에) 동등한 항으로 결합 된 목록 T1,T2 , P P(T1,T2) 에 의해 대체됩니다.

최적화는 외부 조인 작업을 포함 결합 쿼리 계획을 평가할 때 이러한 각 작업에 외부 테이블을 내부 테이블보다 먼저 접근하는 플랜만을 고려합니다. 그런 계획에만 Nested Loop 스키마는 외부 조인 작업을 포함 쿼리를 실행할 수 있기 때문에 최적화 옵션이 제한됩니다.

다음과 같은 형식의 쿼리가 있다고합니다.

 SELECT * T1 LEFT JOIN T2 ON P1 (T1, T2)
   WHERE P (T1, T2) AND R (T2)

테이블 T2 의 일치하는 행 수를 대폭 축소 R(T2) 를 사용하고 있습니다. 쿼리를 그대로 실행 한 경우, 옵티마이 저는 테이블 T2 전에 테이블 T1 에 액세스하는 것 외에 선택의 여지가없이 매우 비효율적 인 실행 계획으로 이어질 수 있습니다.

다행히 MySQL은 WHERE 조건이 NULL을 허용하지 않는 경우 해당 쿼리를 외부 조인 작업을 포함하지 않는 쿼리로 변환합니다. 조건은 가동을 위해 구축 된 NULL 로 보완 된 행에 대해 FALSE 또는 UNKNOWN 으로 평가하는 경우에 외부 조인 작업에 NULL을 허용하지 않습니다라고합니다.

따라서 외부 조인의 경우 :

 T1 LEFT JOIN T2 ON T1.A = T2.A

다음과 같은 조건은 NULL을 허용하지 않습니다.

 T2.B IS NOT NULL,
 T2.B> 3,
 T2.C <= T1.C,
 T2.B <2 OR T2.C> 1

다음과 같은 조건은 NULL을 허용합니다.

 T2.B IS NULL,
 T1.B <3 OR T2.B IS NOT NULL,
 T1.B <3 OR T2.B> 3

조건이 외부 조인 연산에 NULL을 허용하는지 여부를 확인하는 일반적인 규칙은 간단합니다. 조건은 다음의 경우에 NULL을 허용합니다.

  • 그 형식이 A IS NOT NULL 에서 A 가 하나의 내부 테이블의 속성 인 경우

  • 몇개의 인수가 NULL 인 경우 UNKNOWN 으로 평가하는 내부 테이블에 대한 참조를 포함 조건 인 경우

  • NULL을 허용하지 않는 조건을 동등한 항목으로 포함 논리적 인 경우

  • NULL을 허용하지 않는 조건의 논리합 경우.

조건은 쿼리에서 외부 조인 연산에 대해서는 NULL을 허용하지 않습니다 만, 다른 외부 조인 연산에 대해서는 NULL을 받아들이는 경우가 있습니다. 다음 쿼리 :

 SELECT * FROM T1 LEFT JOIN T2 ON T2.A = T1.A
                  LEFT JOIN T3 ON T3.B = T1.B
   WHERE T3.C> 0

WHERE 조건은 두 번째 외부 조인 연산에 대해서는 NULL을 허용하지 않지만 첫 번째 외부 조인 연산에 대해서는 NULL을 허용합니다.

WHERE 조건이 쿼리 외부 조인 작업에 NULL을 허용하지 않는 경우 외부 조인 연산은 내부 조인 연산으로 대체합니다.

예를 들어, 이전의 쿼리는 다음 쿼리로 대체합니다.

 SELECT * FROM T1 LEFT JOIN T2 ON T2.A = T1.A
                  INNER JOIN T3 ON T3.B = T1.B
   WHERE T3.C> 0

원래 쿼리는 최적화 프로그램은 하나의 액세스 순서 T1,T2,T3 만 호환 계획을 평가합니다. 대체 대상 쿼리는 또한 액세스 순서 T3,T1,T2 도 고려합니다.

외부 결합 조작 변환하여 다른 작업 변환이 트리거 될 수 있습니다. 따라서 다음의 쿼리 :

 SELECT * FROM T1 LEFT JOIN T2 ON T2.A = T1.A
                  LEFT JOIN T3 ON T3.B = T2.B
   WHERE T3.C> 0

먼저 다음의 쿼리로 변환됩니다.

 SELECT * FROM T1 LEFT JOIN T2 ON T2.A = T1.A
                  INNER JOIN T3 ON T3.B = T2.B
   WHERE T3.C> 0

이것은 다음의 쿼리와 동일합니다.

 SELECT * FROM (T1 LEFT JOIN T2 ON T2.A = T1.A), T3
   WHERE T3.C> 0 AND T3.B = T2.B

여기서 조건 T3.B=T2.B 는 NULL을 거부하고 외부 조인을 포함하지 않는 쿼리를 얻기 위해 나머지 외부 조인 연산을 내부 조인으로 대체 할 수 있습니다.

 SELECT * FROM (T1 INNER JOIN T2 ON T2.A = T1.A), T3
   WHERE T3.C> 0 AND T3.B = T2.B

경우에 따라서는 포함 된 외부 조인 작업을 대체하는 데 성공도 포함 외부 조인을 변환 할 수없는 경우가 있습니다. 다음 쿼리 :

 SELECT * FROM T1 LEFT JOIN
               (T2 LEFT JOIN T3 ON T3.B = T2.B)
               ON T2.A = T1.A
   WHERE T3.C> 0

은 다음 변환됩니다.

 SELECT * FROM T1 LEFT JOIN
               (T2 INNER JOIN T3 ON T3.B = T2.B)
               ON T2.A = T1.A
   WHERE T3.C> 0,

그것은 포함 외부 조인 작업을 포함 형식에만 작성할 수 있습니다.

 SELECT * FROM T1 LEFT JOIN
               (T2, T3)
               ON (T2.A = T1.A AND T3.B = T2.B)
   WHERE T3.C> 0.

쿼리에 포함 된 외부 조인 연산을 변환하려는 경우 WHERE 조건과 함께 포함 외부 조인에 대한 조인 조건을 고려해야합니다. 다음 쿼리 :

 SELECT * FROM T1 LEFT JOIN
               (T2 LEFT JOIN T3 ON T3.B = T2.B)
               ON T2.A = T1.A AND T3.C = T1.C
   WHERE T3.D> 0 OR T1.D> 0

WHERE 조건은 임베디드 외부 조인에 대해서는 NULL을 받아들이지 만 포함 외부 조인 T2.A=T1.A AND T3.C=T1.C 조인 조건은 NULL을 허용하지 않습니다. 따라서 쿼리는 다음 변환 할 수 있습니다.

 SELECT * FROM T1 LEFT JOIN
               (T2, T3)
               ON T2.A = T1.A AND T3.C = T1.C AND T3.B = T2.B
   WHERE T3.D> 0 OR T1.D> 0


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved