MySQL 쿼리 최적화

Mec.D's Blog·2022년 3월 4일
1

실행 계획

실행 계획 테이블 출력

EXPLAIN
SELECT 구문

매칭 테이블

  • 하나의 Column만 갖고 있는 매칭 테이블
  • 옵티마이저는 쿼리 실행 시 이 테이블을 가장 먼저 읽습니다.
  • 그래서 옵티마이저는 나머지 테이블을 읽을 때 매칭 테이블을 상수처럼 활용합니다.

스캔 타입

종류설명
system하나의 컬럼만 갖는 특수한 const 방식
const조인 없이 유니크 인덱스를 탄 쿼리의 결과 행 (Row) 건수가 1개로 예상될 때
Index Unique Scan
✅ 적용 조건 : Where절에서 PK나 Unique 인덱스를 동등 비교 (=)
❗ 쿼리 실행 전에 결과가 1건임을 예측할 수 있어야 합니다.
eq_ref조인 수행 후 유니크 인덱스를 탄 쿼리의 결과 행 (Row) 건수가 1개로 예상될 때
✅ 적용 조건 : 조인 시 Where절에서 테이블1의 컬럼값과
     테이블2의 PK 또는 Unique 인덱스를 동등 비교 (=)

ex: SELECT * FROM t1, t2 WHERE t1.id = t2.id
💬 const 방식과 유사하되, 조인 조건에 const가 쓰인 경우라 할 수 있습니다.
ref결과 Row 건수는 알 수 없지만 쿼리가 일반 인덱스를 탔을 때
✅ 적용 조건 : Where절에서 일반 인덱스를 동등 비교 (=)
❗ 조인 여부와는 무관합니다.
fulltext쿼리가 전문 (fulltext) 검색 인덱스를 탔을 때
ref_or_nullref 방식의 조건에서 Null 비교가 추가됐을 때
✅ 적용 조건 : Where절에서 일반 인덱스 동등 비교 (=) + Null 비교
unique_subqueryWhere절에 IN (서브쿼리) 를 사용한 상태에서
Where절의 서브쿼리 결과가 모두 Unique할 때
index_subqueryWhere절에 IN (서브쿼리) 를 사용한 상태에서
Where절의 서브쿼리 결과의 중복을 인덱스로 제거할 수 있을 때
range인덱스를 범위 비교했을 때
Index Range Scan
✅ 적용 조건 : Where절에서 인덱스를 범위 비교
ex) <, >, BETWEEN, IN, LIKE, IS NULL 등
index_merge2개 이상의 인덱스를 이용해 각각 검색 후, 결과를 하나로 합칠 때
추가 학습 필요
indexconst, ref, range 방식을 적용할 수 없어
인덱스를 처음부터 끝까지 읽어야 하는 경우
Index Full Scan
✅ 적용 조건
① 데이터 파일을 읽지 않고, 인덱스 컬럼으로 처리 가능한 경우
② 또는 인덱스로 정렬, 그룹핑 작업을 대체할 수 있는 경우

❗ Limit와 함께 사용하면 효율 개선
ALL인덱스를 탈 수 없어 전체 테이블을 읽어야할 때
Table Full Scan


❗ 다중 컬럼 PK 동등 비교 (=) 시
   ① 전체 컬럼 비교 : const 적용
   ② 첫번째 컬럼을 포함한 일부 컬럼 비교 : ref 적용
   ③ 첫번째 컬럼 포함 ❌ 일부 컬럼 비교 : ALL 적용



인덱스

용어

카디널리티

테이블 Row 개수에 비해
컬럼의 카디널리티가 높다 = 컬럼 값 중복이 적다


참고 자료

[MySQL] 실행계획 (Execution Plan) - (2) type | 테드의 기술블로그

RealMysql 6장 실행계획 정리 | Myanglog

MySQL 실행 계획 | 기본기를 쌓는 정아마추어 코딩블로그

[Oracle] Index 탐색 방식 - Unique,Range,Full,Fast,Skip | 마이자몽

profile
기술로 더 나은 미래를 디자인하는 개발자 MEC:D 입니다

0개의 댓글