• 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. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 1. 데이터 정의 문
    2. 데이터 조작 문
    1. CALL 구문
    2. DELETE 구문
    3. DO 구문
    4. HANDLER 구문
    5. INSERT 구문
    6. LOAD DATA INFILE 구문
    7. LOAD XML 구문
    8. REPLACE 구문
    9. SELECT 구문
    10. 서브 쿼리 구문
    1. 스칼라 피연산자로 서브 쿼리
    2. 서브 쿼리를 사용한 비교
    3. ANY, IN 또는 SOME을 사용한 서브 쿼리
    4. ALL을 사용한 서브 쿼리
    5. 13.2.10.5 row(행) 서브 쿼리
    6. EXISTS 또는 NOT EXISTS를 사용한 서브 쿼리
    7. 상관 서브 쿼리
    8. FROM절의 서브 쿼리
    9. 서브 쿼리 오류
    10. 서브 쿼리의 최적화
    11. 서브 쿼리의 결합으로 재 작성
    11. UPDATE 구문
    3. MySQL 트랜잭션과 잠금 문
    4. 복제 문
    5. Prepared Statements위한 SQL 구문
    6. MySQL 복합문 구문
    7. 데이터베이스 관리 문
    8. MySQL 유틸리티 문
  • 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 새로운 기능

13.2.10.10 서브 쿼리의 최적화

개발이 진행중이기 때문에 장기간 안정적인 최적화 팁은 없습니다. 다음 목록은 시도해 볼만한 흥미로운 몇 가지 조언을 보여줍니다.

  • 서브 쿼리에서 행의 수와 순서에 영향을 미치는 서브 쿼리 절을 사용합니다. 예 :

     SELECT * FROM t1 WHERE t1.column1 IN
       (SELECT column1 FROM t2 ORDER BY column1);
     SELECT * FROM t1 WHERE t1.column1 IN
       (SELECT DISTINCT column1 FROM t2);
     SELECT * FROM t1 WHERE EXISTS
       (SELECT * FROM t2 LIMIT 1);
    
  • 결합을 서브 쿼리로 바꿉니다. 예를 들어, 다음을 시도하십시오 :

     SELECT DISTINCT column1 FROM t1 WHERE t1.column1 IN (
       SELECT column1 FROM t2);
    

    다음의 대안으로 :

     SELECT DISTINCT t1.column1 FROM t1, t2
       WHERE t1.column1 = t2.column1;
    
  • 서브 쿼리를 지원하지 않는 이전 버전의 MySQL과의 호환성을 위해 일부 서브 쿼리를 조인으로 변환 할 수 있습니다. 그러나 경우에 따라서는 서브 쿼리를 조인으로 변환하면 성능을 향상시킬 수 있습니다. 섹션 13.2.10.11 "서브 쿼리의 결합으로 재 작성" 을 참조하십시오.

  • 어구를 서브 쿼리의 외부에서 내부로 이동합니다. 예를 들어, 다음 쿼리를 사용하십시오 :

     SELECT * FROM t1
       WHERE s1 IN (SELECT s1 FROM t1 UNION ALL SELECT s1 FROM t2);
    

    다음 쿼리의 대안으로 :

     SELECT * FROM t1
       WHERE s1 IN (SELECT s1 FROM t1) OR s1 IN (SELECT s1 FROM t2);
    

    다른 예로,이 쿼리를 사용하십시오 :

     SELECT (SELECT column1 +5 FROM t1) FROM t2;
    

    다음 쿼리의 대안으로 :

     SELECT (SELECT column1 FROM t1) +5 FROM t2;
    
  • 상관 서브 쿼리 대신 행 서브 쿼리를 사용합니다. 예를 들어, 다음 쿼리를 사용하십시오 :

     SELECT * FROM t1
       WHERE (column1, column2) IN (SELECT column1, column2 FROM t2);
    

    다음 쿼리의 대안으로 :

     SELECT * FROM t1
       WHERE EXISTS (SELECT * FROM t2 WHERE t2.column1 = t1.column1
                     AND t2.column2 = t1.column2);
    
  • a <> ALL (...) 대신 NOT (a = ANY (...)) 를 사용합니다.

  • x=1 OR x=2 가 아닌 x = ANY ( table containing (1,2) ) 를 사용합니다.

  • EXISTS 대신 = ANY 를 사용합니다.

  • 항상 1 개의 행을 반환 비 상관 서브 쿼리의 경우 IN 항상 = 보다 느립니다. 예를 들어, 다음 쿼리를 사용하십시오 :

     SELECT * FROM t1
       WHERE t1. col_name = (SELECT a FROM t2 WHERE b = some_const );
    

    다음 쿼리의 대안으로 :

     SELECT * FROM t1
       WHERE t1. col_name IN (SELECT a FROM t2 WHERE b = some_const );
    

이러한 조언에 따라 프로그램은 빠를도 늦어지는 경우도 있습니다. BENCHMARK() 함수 등의 MySQL 기능을 사용하면 현재의 상황에 어떤 도움이되는지에 대한 아이디어를 얻을 수 있습니다. 섹션 12.14 "정보 함수" 를 참조하십시오.

MySQL 자체가 실시하는 몇개의 최적화를 보여줍니다.

  • MySQL은 비 상관 서브 쿼리를 한 번만 실행합니다. 특정 서브 쿼리가 실제로 비 상관이되도록하려면 EXPLAIN 을 사용합니다.

  • MySQL은 하위 쿼리 선택 목록 컬럼에 인덱스가 설정 될 가능성을 이용하려고, IN , ALL , ANY 및 SOME 서브 쿼리를 다시 작성합니다.

  • MySQL은 다음과 같은 형식의 서브 쿼리를 인덱스 검색 기능을 대체합니다. 이 함수는 EXPLAIN 에 의해 특수한 결합 형 ( unique_subquery 또는 index_subquery )로 묘사됩니다.

     ... IN (SELECT indexed_column FROM single_table ...)
    
  • MySQL은 다음과 같은 형식의 식을 NULL 값 또는 빈 세트가 포함되어 있지 않은 한, MIN() 또는 MAX() 를 포함하는 식으로 확장합니다.

     value {ALL | ANY | SOME} {> | <|> = | <=} ( uncorrelated subquery )
    

    예를 들어, 다음의 WHERE 절

     WHERE 5> ALL (SELECT x FROM t)
    

    는 최적화에 의해 다음과 같이 처리 될 수 있습니다.

     WHERE 5> (SELECT MAX (x) FROM t)
    

" MySQL Internals : How MySQL Transforms Subqueries "도 참조하십시오.

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