본문 바로가기

db/MySql

SELECT 최적화

SELECT 처리 순서

하나의 실행 계획 단위에서 키워드가 적용되는 순서는 다음과 같다.

WHERE → JOIN → GROUP BY → DISTINCT → HAVING → ORDER BY → LIMIT

원하는 키워드를 먼저 실행하고 싶다면 서브 쿼리를 이용하여 실행 계획을 분리하여 순서를 임의 변경하여 실행할 수 있다. 하지만 서브 쿼리를 이용하면 조인을 사용하는 것보다 성능 상 좋지 않기 때문에 잘 판단하여 쿼리를 작성하는 것이 좋다.

  • MySQL의 LIMIT VS Oracle ROWNUM
  • MySQL의 LIMIT은 오라클의 ROWNUM과 성격이 달라서 WHERE 조건으로 사용되지 않고 항상 모든 처리의 결과에 대하여 레코드 건수를 제한하는 형태로 사용한다.

각 키워드의 성능 최적화 방식

성능을 이끌어 내기 위해서 인덱스를 통한 효율적인 탐색이 필요하다. 어떻게 하면 각 키워드에서 인덱스를 사용할 수 있는지 알아보자.

 

  1. 인덱스를 사용하기 위한 기본 규칙
  • 칼럼의 값을 변형하지 말아야 한다.

인덱스로 사용 가능한 칼럼이라고 하더라도 값을 변형하면 인덱스를 사용할 수 없다.

 

  1. WHERE 절 인덱스 사용
  • 조건 칼럼이 인덱스가 존재하면 가능
  • 다중 조건 시 AND 는 레코드 건수를 줄여 성능 향상 가능
  • 다중 조건 시 OR 은 경우에 따라 FULL RANGE SCAN을 사용해야만 할 수 있기에 주의해야 함.

인덱스를 사용한 칼럼 조건을 통해 범위 제한하는 방식이 이상적인 최적화 방법

 

  1. 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 : 인덱스 사용 불가

 

  1. ORDER BY 절 인덱스 사용
  • GROUP BY 의 인덱스 사용 조건을 충족 해야 한다.
  • 모든 칼럼의 정렬 순서 일치 해야 한다.

 

  1. 각 조건에 따른 인덱스 사용

'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