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 # 가능
GROUP BY랑 비슷한데, 각 칼럼의 오름차순 혹은 내림차순 옵션이 인덱스와 같거나 정반대인 경우에만 사용 가능하다.
-- 사용 예시 (인덱스 col1, col2, col3, col4)
ORDER BY col1, col2 DESC, col3 # col1, col3은 오름차순, col2는 내림차순이라 사용 불가
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에 명시된 컬럼이 순서와 내용이 모두 같아야한다.