[INDEX] GROUP BY, ORDER BY 인덱스 튜닝

chae·2023년 11월 22일
0

DataBase

목록 보기
15/16
post-thumbnail

🔧 GROUP BY 인덱스 튜닝

GROUP BY 문에서 인덱스를 태우려면 조건이 있다.

1. GROUP BY에 명시된 칼럼은 인덱스 칼럼의 순서와 위치가 같아야한다.
2. 뒤쪽 칼럼은 GROUP BY에 명시되지 않아도 되지만, 앞쪽에 있는 칼럼이 GROUP BY에 없다면 인덱스를 사용할 수 없다.
3. GROUP BY에 있는 칼럼이 하나라도 인덱스에 없으면 인덱스 사용 불가
-- 사용 예시들 (인덱스 col1, col2, col3, col4)

... GROUP BY col1 # 가능
... GROUP BY col1, col2 # 가능
... GROUP BY col1, col2, col3 # 가능
... GROUP BY col1, col2, col3, col4 # 가능

... GROUP BY col2, col1 # 순서 불일치, 불가능
... GROUP BY col1, col3, col2 # 순서 불일치,  불가능
... GROUP BY col1, col3 # col2 누락
... GROUP BY col1, col2, col3, col4, col5 # col5 인덱스에 없어서 불가능

... WHERE col1 = '상수' GROUP BY col2, col3 # 가능
... WHERE col1 = '상수', col2 = '상수' GROUP BY col3, col4 # 가능

🔧 ORDER BY 인덱스 튜닝

GROUP BY랑 비슷한데, 각 칼럼의 오름차순 혹은 내림차순 옵션이 인덱스와 같거나 정반대인 경우에만 사용 가능하다.

-- 사용 예시 (인덱스 col1, col2, col3, col4)

ORDER BY col1, col2 DESC, col3 # col1, col3은 오름차순, col2는 내림차순이라 사용 불가

🔧 WHERE 조건과 ORDER BY (or GROUP BY) 절의 인덱스 사용

인덱스의 앞쪽에 있는 컬럼을 WHERE 절에서 상수로 비교하기 때문에 GROUP BY 절에 해당 컬럼이 명시되지 않아도 인덱스를 이용한 경우

SELECT * FROM tb_test WHERE COL1 > 10 ORDER BY COL1,COL2,COL3;
-- COL1>10 조건을 만족하는 COL1 값은 여러 개일 수 있고
- COL1부터 COL3 까지 순서대로 모두 명시됐기 때문에 인덱스를 이용해 WHERE,ORDER BY 절을 처리 가능

SELECT * FROM tb_test WHERE COL1 > 10 ORDER BY COL2,COL3 ;
-- WHERE 절에서 COL1 범위 조건으로 ORDER BY 절에는 COL1 이 명시되지 않았기 때문에 
-- 정렬할 때는 인덱스를 이용할 수 없게 된다.

🔧 GROUP BY, ORDER BY 절의 인덱스 사용

GROUP BY, ORDER BY가 모두 사용된 쿼리에서 두 절이 모두 하나의 인덱스를 사용해 처리하려면, GROUP BY에 명시된 컬럼과 ORDER BY에 명시된 컬럼이 순서와 내용이 모두 같아야한다.

profile
배움은 즐겁습니다.

0개의 댓글