[MySQL] WHERE + GROUP BY 인덱스 이용 0 2 1,163

by 내몸매GROUPBY [MySQL] [2019.05.12 22:25:28]


GROUP BY절에 오는 컬럼이 인덱스에 명시된 컬럼과 동일하면 인덱스를 사용할 수 있다고 알고 있습니다.

Index(col1, col2, col3, col4, col5)라고 했을 때

GROUP BY col1

GRUOP BY col1, col2

GRUOP BY col1, col2, col3

GRUOP BY col1, col2, col3, col4

GRUOP BY col1, col2, col3, col4, col5

PROBLEM

WHERE절에서 상수로 비교하기 때문에 GROUP BY절에 해당 컬림이 명시되지 않아도 인덱스를 이용한 그룹핑이 가능한 예제입니다.

WHERE COL1='상수'... GROUP BY COL2, COL3

 

QUESTION

COL1='상수'와 일치하는 레코드들이 COL1으로 정렬된 순서대로 디스크에서 읽혀졌을거고

GROUP BY는 그룹핑하려는 레코드들이 정렬되어있기 때문에 인덱스를 사용할 수 있다는 말일까요..

1. 제가 생각하는게 맞나요?

2. COL1 > '상수'와 같은 비교 연산자로 사용하면 위와같은 GROUP BY COL2, COL3는 쓰지 못하나요? 왜그럴까요?

제 생각엔 이 때도 COL1으로 정렬된 순서대로 디스크에서 읽혀졌을텐데.. 뭐가 다를까요

3. GROUP BY가 인덱스를 사용한다는 것은 WHERE절을 통해 읽혀진 레코드를 이용하여 GROUP BY를 한다는게 아니라 인덱스 파일에 접근해서 한다는 뜻인가요?

그렇게 될 경우 GROUP BY절에서 디스크에서 레코드를 또 읽어오나요?

 

by 마농 [2019.05.13 09:01:12]

1. 제가 생각하는게 맞나요?  ==> 네
2. COL1 > '상수'와 같은 비교 연산자로 사용하면 위와같은 GROUP BY COL2, COL3는 쓰지 못하나요? 왜그럴까요?
 - col1 이 고정이어야 col2, col3 만 봤을 때 정렬된 상태가 되지요.
 - col1 이 고정이 아니라면? col2, col3 만 봤을 때 정렬된 상태가 아닌게 됩니다.
 - 예를 들어 col1 에 1, 2 가 있고 col2 에 3,4 가 있다고 가정했을 때
 - col1 = 1 조건에서의 col2 는 3,4 상태로 정렬이 되어 있지만
 - col1 >= 1 조건에서의 col2 는 3,4,3,4 상태로 정렬이 되어 있지 않지요.
 - 그렇다고 GROUP BY COL2, COL3는 쓰지 못하는건 아니죠.
 - 쓸 수 는 있으나 효율적으로 인덱스를 이용하지 못하는 것일 뿐이죠.
3. GROUP BY가 인덱스를 사용한다는 것은 WHERE절을 통해 읽혀진 레코드를 이용하여 GROUP BY를 한다는게 아니라 인덱스 파일에 접근해서 한다는 뜻인가요?
그렇게 될 경우 GROUP BY절에서 디스크에서 레코드를 또 읽어오나요?
 - where 절 이용할 때도 인덱스를 이용하겠지요.
 - 특정 col1 에 대해 인덱스를 이용해 가져온 값들은 col2, col3, col4, col5 로 정렬되어 있죠.
 - 인덱스를 이용한다면? 집계 항목이 인덱스 외의 항목이라면? 테이블을 다시 한번 더 읽게 되겠네요.
 - 인덱스 내에서 해결이 된다면 인덱스만 읽고 끝날 것입니다.
 - SELECT SUM(col3) FROM t WHERE col1 = 1 GROUP BY col2);  -- 인덱스만 읽고 끝남.
 - SELECT SUM(col6) FROM t WHERE col1 = 1 GROUP BY col2);  -- 인덱스 스캔후 테이블 엑세스 필요.
4. 이 문제의 요점은
 - 그룹바이 이용시 정렬이 수반된단는데 있는 것 같습니다.
 - 정렬은 부담되는 작업이므로, 인덱스를 이용해 정렬을 하지 않고도 정렬된 결과를 얻을 수 있다는 거죠.


by 내몸매GROUPBY [2019.05.13 09:06:46]

와 진짜 머리속에 쏚쏚 들어오네요 감사합니다ㅠ 소름돋ㅊ탓어요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입