MySQL Group By 최적화

어제 MySQL 의 loose index scan 에 관 한 블 로그 (http://www.cnblogs.com/wingsless/p/5037625.html) 나중에 나 는 지난번 에 언급 한 그 최적화 방법 에서 주요 한 목적 은 loose index scan 을 실현 하 는 것 이 고 계획 을 집행 하 는 측면 에서 볼 때 Extra 정보 에서 'Using index for group - by' 가 되 어야 한 다 는 것 을 알 게 되 었 다.이렇게 보면 MySQL 은 distinct 를 처리 할 때 group by 와 같은 최적화 수단, 즉 색인 을 사용 하여 loose index scan 을 진행 할 수 있 습 니 다.그럼 오늘 공식 문 서 를 연구 해 보 니 그 렇 군요.
    사실 group by 에 있어 서 가장 일반적인 실현 방법 은 전체 표 스 캔 을 한 번 하고 모든 group by 줄 을 임시 table 에 순서대로 저장 한 다음 에 그룹 식별 이나 취 합 작업 을 하 는 것 이다.이런 문 제 는 너무 복잡 하고 시간 적 으로 오래 걸 리 며 공간 적 소모 도 적지 않다 는 것 이다.이때 MySQL 은 색인 을 이용 하여 group by 를 최적화 할 수 있 습 니 다.
    여기 서 loose index scan 이 무엇 인지 말 할 수 있 습 니 다. 공식 적 인 정의 에 따 르 면 이 방법 은 색인 중의 일부 데이터 만 스 캔 해 야 합 니 다. where 조건 을 만족 시 키 는 모든 데이터 가 아니 라 loose index scan 이 라 고 합 니 다.
    다음은 어떤 상황 에서 loose index scan 을 사용 할 수 있 는 상황 입 니까?
    단일 표 조회
    2 Group by 중 가장 왼쪽 접두사 열 만 있 고 다른 열 은 없습니다.
    3. max 와 min 집합 만 지원 합 니 다. 그리고 집합 할 열 은 group by 에 있 는 색인 이 어야 합 니 다.
    4. group by 에 인용 되 지 않 은 색인 의 다른 부분 은 상수 여야 합 니 다.
    5. 접두사 색인 은 지원 되 지 않 습 니 다.
    t1 (c1, c2, c3, c4) 표 에 c1, c2, c3 열 을 포함 한 색인 이 있다 고 가정 하면 다음 조 회 는 모두 loose index scan 을 할 수 있 습 니 다.
    
SELECT c1, c2 FROM t1 GROUP BY c1, c2;
SELECT DISTINCT c1, c2 FROM t1;
SELECT c1, MIN(c2) FROM t1 GROUP BY c1;
SELECT c1, c2 FROM t1 WHERE c1 < const GROUP BY c1, c2;
SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 > const GROUP BY c1, c2;
SELECT c2 FROM t1 WHERE c1 < const GROUP BY c1, c2;
SELECT c1, c2 FROM t1 WHERE c3 = const GROUP BY c1, c2;

    이것들 은 모두 베 낀 공식 문서 로 정확성 이 완전히 검증 되 지 않 았 다. 
    다음 SQL 에 서 는 loose index scan 을 사용 할 수 없습니다.
    
--         max  min
SELECT c1, SUM(c2) FROM t1 GROUP BY c1;

--            
SELECT c1, c2 FROM t1 GROUP BY c2, c3;

--             ,  group by   ,          ,   WHERE c3 = const   
SELECT c1, c3 FROM t1 GROUP BY c1, c2;

     다른 취 합 함수 도 loose index scan 을 사용 할 수 있 습 니 다. 예 를 들 어 AVG (DISTINCT), SUM (DISTINCT), COUNT (DISTINCT) 등 입 니 다.
     아래 의 이 문장 들 도 가능 하 다.
     
SELECT COUNT(DISTINCT c1), SUM(DISTINCT c1) FROM t1;

SELECT COUNT(DISTINCT c1, c2), COUNT(DISTINCT c2, c1) FROM t1;

      많은 문 구 는 5.7 의 문서 에서 발췌 한 것 으로 정확성 이 검증 되 지 않 았 다. 비록 공식 문서 가 권위 라 고 하지만 책 을 믿 는 것 이 책 이 없 는 것 보다 못 하고 종이 에 있 는 것 이 끝 이 얕 아서 이 일 을 직접 해 야 한 다 는 것 을 잘 알 고 있다. 내일 주말 에 나 는 조목조목 테스트 한 후에 더욱.

좋은 웹페이지 즐겨찾기