https://mariadb.com/kb/en/library/building-the-best-index-for-a-given-select/
위 URL에서 step 2b(GROUP BY) 섹션을 보고있습니다.
PROBLEM
WHERE aaa = 123 AND bbb = 1 GROUP BY ccc ⇒ INDEX(bbb, aaa, ccc) or INDEX(aaa, bbb, ccc) (='s first, in any order; then the GROUP BY)
QUESTION
GROUP BY를 한다는 것은 그룹핑을하고 집계를 사용하기 위함인데 제가 어떤 컬럼을 기준으로 그룹핑 하고싶은지도 모르면서 왜 ccc를 그룹핑 하는걸 가이드로 제시하는걸까요 전 도저히 이해가 가지 않네요ㅠ
PROBLEM
GROUP BY x,y ⇒ INDEX(x,y) (no WHERE)
QUESTION
인덱스가 x,y로 잡혀있고 GROUP BY x,y를 하고있습니다. 근데 no WHERE이라고 써있네요.
이거 WHERE절 사용하지 말라는거 맞죠? 왜 사용하지 말라고 했을까요?
가령 WHERE x = 1 GROUP BY x,y를 하는건 위 GROUP BY x,y보다 성능적으로 떨어지거나 불이익이 있을까요?
제가 생각하기론 WHERE x = 1은 인덱스로 빠르게 찾을거고, 읽어진 레코드들은 이미 x 컬럼을 기준으로 정렬되어 있는 상태일 것이고 GROUP BY를 실행할 때 차레대로 레코드를 읽으면서 집계만 하면 되므로 오히려 GROUP BY x,y 처럼 전체 레코드를 집계하는 것보다 더 빠를것 같은데 제가 잘못이해했나요?
1. 어떤 컬럼을 기준으로 그룹핑 하고싶은지도 모르면서 왜 ccc를 그룹핑 하는걸 가이드로 제시하는걸까요?
--> GROUP BY ccc 는 가이드가 아니라 가이드를 해야 할 문제 상황입니다.
--> 가이드는 그 옆에 나오는INDEX 부분이죠.
--> 즉, where 절과 group by 절이 좌측과 같을 경우 우측과 같은 인덱스가 필요하다.
2. no WHERE이라고 써있네요. 이거 WHERE절 사용하지 말라는거 맞죠? 왜 사용하지 말라고 했을까요?
--> where 를 쓰지 말라는게 아닙니다.
--> where 절이 없는 그룹바이의 경우를 의미하는 듯 합니다.
3. 전체적으로 보면
--> 구문을 작성하는 법을 알려주는게 아니라
--> 해당 구문이 주어졌을 때 적절한 인덱스가 필요하다는 것입니다.