• 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.10 Nested Loop 조인 알고리즘

MySQL은 Nested Loop 알고리즘 또는 변형을 사용하여 테이블 간의 조인을 수행합니다.

Nested Loop 조인 알고리즘

간단한 Nested Loop Join (NLJ) 알고리즘은 루프의 첫 번째 테이블에서 행을 한 번에 하나씩 읽고 각 행을 조인 다음 테이블을 처리하는 중첩 루프에 전달합니다. 이 프로세스는 결합하는 테이블이 남아있는만큼 반복됩니다.

3 개의 테이블 t1 , t2 및 t3 사이의 결합이 다음 결합 형을 사용하여 실행합니다.

 Table Join Type
 t1 range
 t2 ref
 t3 ALL

간단한 NLJ 알고리즘을 사용하면 결합은 다음과 같이 처리됩니다.

 for each row in t1 matching range {
   for each row in t2 matching reference key {
     for each row in t3 {
       if row satisfies join conditions,
       send to client
     }
   }
 }

NLJ 알고리즘은 외부 루프에서 내부 루프에 한 번에 한 행씩 전달하므로 일반적으로 내부 루프에서 처리되는 테이블을 여러 번 읽습니다.

Block Nested Loop 조인 알고리즘

Block Nested-Loop (BNL) 결합 알고리즘은 외부 루프에서 읽은 행 버퍼링을 사용하여 내부 루프에서 테이블을 읽어야하는 횟수가 줄어 듭니다. 예를 들어, 버퍼에 10 행이 읽혀이 버퍼가 다음 내부 루프에 전달되면 내부 루프에서 읽을 각 행을 버퍼에있는 모든 10 행과 비교할 수 있습니다. 이렇게하면 내부 테이블을 읽어야하는 횟수가 크게 감소합니다.

MySQL은 다음의 조건에서 결합 버퍼링을 사용합니다.

  • join_buffer_size 시스템 변수에 의해 각 결합 버퍼의 크기를 결정합니다.

  • 결합 버퍼링은 결합의 형태가 ALL 또는 index 이다 (즉, 사용할 수있는 키가 아닌 데이터 행 또는 인덱스 행의 전체 검사가 수행되는 경우)하거나 range 인 경우에 사용할 수 있습니다. MySQL 5.6에서는 섹션 8.2.1.14 "Block Nested Loop 조인과 Batched Key Access 결합" 에 설명 된대로 버퍼링 사용이 외부 조인에 적용 할 수 있도록 확장되어 있습니다.

  • 버퍼링 가능한 결합에 대해 하나의 버퍼가 할당되기 때문에 특정 쿼리가 여러 결합 버퍼를 사용하여 처리 될 수 있습니다.

  • ALL 형 또는 index 형 이어도 첫 번째 비 상수 테이블에 조인 버퍼를 할당 할 수 없습니다.

  • 결합 버퍼는 결합을 실행하기 전에 할당 쿼리가 완료된 후 해제됩니다.

  • 결합 버퍼는 행 전체가 아니라 결합 관련 열만 포함됩니다.

NLJ 알고리즘 (버퍼링 없음)의 앞부분에 결합의 예에서는 결합은 결합 버퍼링을 사용하면 다음과 같이 실행됩니다.

 for each row in t1 matching range {
   for each row in t2 matching reference key {
     store used columns from t1, t2 in join buffer
     if buffer is full {
       for each row in t3 {
         for each t1, t2 combination in join buffer {
           if row satisfies join conditions,
           send to client
         }
       }
       empty buffer
     }
   }
 }

 if buffer is not empty {
   for each row in t3 {
     for each t1, t2 combination in join buffer {
       if row satisfies join conditions,
       send to client
     }
   }
 }

S 가 결합 버퍼에 저장되는 각 t1 , t2 조합의 크기이며, C 가 버퍼의 조합의 수인 경우 테이블 t3 가 스캔되는 횟수는 :

 ( S * C ) / join_buffer_size +1

join_buffer_size 전에 모든 행의 조합을 유지하기에 충분한 크기가 될 때까지 join_buffer_size 값이 클수록 t3 스캔 횟수는 줄어 듭니다. 그 시점에서는 더욱 크게해도 속도는 향상되지 않습니다.

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