우리가 SELECT 쿼리를 실행시킬 때, 해당 쿼리는 FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY 으로 나뉘어져 정해진 순서에 따라서 실행된다.
순서는 아래 그림과 다음과 같다.
1. FROM
먼저, FROM절을 바탕으로 데이터를 읽어올 테이블을 설정한다.
만약 FROM절에 JOIN이 포함되어있다면, 가상 테이블에 JOIN으로 합쳐진 데이터를 결합한다.
2. WHERE
FROM절로 가져온 데이터에 대하여 WHERE절에 명시된 필터링을 실행한다.
3. GROUP BY
1, 2 단계를 거쳐 추출된 데이터들을 GROUP BY에 명시된 컬럼을 기준으로 그룹핑한다.
4. HAVING
그룹핑된 데이터에 대하여 HAVING절에 명시된 필터링을 실행한다.
주의점은 WHERE절과의 차이점을 인지하는 것이다.
그룹핑된 데이터에 필터링을 거는 작업이므로 당연히 GROUP BY 없인 사용할 수 없으며, 만약 WHERE절에 걸 수 있는 필터라면 HAVING보다는 WHERE절에 거는 것이 바람직하다.
비교적 앞 단계에서 실행되는 WHERE에서 필터링을 걸고 오면 이후 구문에서 처리하는 데이터 양을 줄일 수 있을 것이다.
5. SELECT
앞선 작업을 거치고 살아남은 데이터에 대하여 출력할 컬럼을 선택한다.
6. ORDER BY
추출된 데이터를 보여줄 순서를 적용한다.
실행순서를 이해하면 좋은 점
쿼리가 실행되는 순서를 정확히 이해하면, 보다 정확하고 효율적인 쿼리를 작성할 수 있다.
앞서 언급한대로, WHERE가 HAVING보다 먼저 실행된다는 것을 알면 필터링 조건을 보다 효율적으로 걸 수 있을 것이며
여러 개의 테이블들을 조인한다거나 서브 쿼리 등을 사용하는 복잡한 쿼리를 작성할 때 실행 계획을 근거로 비효율을 조기에 탐지하고 쿼리 튜닝 및 분리 작업을 수행할 수 있을 것이다.
참고
https://dev.mysql.com/doc/refman/8.0/en/select.html
'데이터베이스' 카테고리의 다른 글
Redis의 HA(High Availability) 전략 알아보기! (1) | 2024.05.02 |
---|---|
MySQL의 Using temporary, Using filesort (+ 정렬 방식) 정리! (1) | 2024.02.12 |
HikariCP의 커넥션 maxLifetime과 MySQL wait timeout간의 관계 알아보기! (0) | 2024.01.23 |
[데이터베이스] 트랜잭션과 ACID (2) | 2021.08.08 |