SELECT 처리 순서
하나의 실행 계획 단위에서 키워드가 적용되는 순서는 다음과 같다.
WHERE → JOIN → GROUP BY → DISTINCT → HAVING → ORDER BY → LIMIT
원하는 키워드를 먼저 실행하고 싶다면 서브 쿼리를 이용하여 실행 계획을 분리하여 순서를 임의 변경하여 실행할 수 있다. 하지만 서브 쿼리를 이용하면 조인을 사용하는 것보다 성능 상 좋지 않기 때문에 잘 판단하여 쿼리를 작성하는 것이 좋다.
- MySQL의 LIMIT VS Oracle ROWNUM
- MySQL의 LIMIT은 오라클의 ROWNUM과 성격이 달라서 WHERE 조건으로 사용되지 않고 항상 모든 처리의 결과에 대하여 레코드 건수를 제한하는 형태로 사용한다.
각 키워드의 성능 최적화 방식
성능을 이끌어 내기 위해서 인덱스를 통한 효율적인 탐색이 필요하다. 어떻게 하면 각 키워드에서 인덱스를 사용할 수 있는지 알아보자.
- 인덱스를 사용하기 위한 기본 규칙
- 칼럼의 값을 변형하지 말아야 한다.
인덱스로 사용 가능한 칼럼이라고 하더라도 값을 변형하면 인덱스를 사용할 수 없다.
- WHERE 절 인덱스 사용
- 조건 칼럼이 인덱스가 존재하면 가능
- 다중 조건 시 AND 는 레코드 건수를 줄여 성능 향상 가능
- 다중 조건 시 OR 은 경우에 따라 FULL RANGE SCAN을 사용해야만 할 수 있기에 주의해야 함.
인덱스를 사용한 칼럼 조건을 통해 범위 제한하는 방식이 이상적인 최적화 방법
- GROUP BY 절 인덱스 사용
- GROUP BY 절에 명시된 칼럼의 순서가 인덱스를 구성하는 칼럼의 순서와 같으면 인덱스를 사용할 수 있다.
- 예제
COL1 → COL2 → COL3 순으로 생성된 인덱스가 존재하는 경우에
GROUP BY COL1, COL2 : 인덱스 사용가능
GROUP BY COL2, COL3 : 인덱스 사용불가
만약 이전 연산으로 인덱스의 범위를 제한한다면 인덱스를 사용할 수 있다.
WHERE COL1=123 GROUP BY COL2, COL3 : 인덱스 사용 가능
WHERE COL1=123 GROUP BY COL3 : 인덱스 사용 불가
- ORDER BY 절 인덱스 사용
- GROUP BY 의 인덱스 사용 조건을 충족 해야 한다.
- 모든 칼럼의 정렬 순서 일치 해야 한다.
- 각 조건에 따른 인덱스 사용
'db > MySql' 카테고리의 다른 글
MySQL 연산자와 내장 함수 (0) | 2023.03.11 |
---|---|
MySQL의 주요 처리 방식 (0) | 2023.03.06 |
DB 실행 계획 분석 EXPLAIN - 2 (0) | 2023.03.05 |
DB 실행 계획 분석 EXPLAIN - 1 (0) | 2023.02.22 |