실행계획(Execution Plan)
인덱스 확인하려면?
인덱스가 효과적으로 작동하는지 확인하려면 몇 가지 방법이 있음
- 실행 계획 확인
- 쿼리 실행 시간 분석
- 데이터베이스 통계 및 모니터링 툴 활용
실행계획이란?
- 사용자가 SQL을 실행하여 데이터를 추출하려고 할 때 옵티마이저가 수립하는 작업절차
실행계획 분석 시 확인해야 할 항목
- 인덱스 활용 여부 확인
- Full Table Scan
- Index Scan (Index Range Scan, Index Unique Scan, Index Skip Scan...)
- 조인 방식과 순서 확인
- 필터링 조건 위치
실행 계획 조회
EXPLAIN SELECT * FROM users
WHERE age = 20;

- id: 실행 단계 순서
- select_type: SELECT문 유형
- SIMPLE: 단순 SELECT
- PRIMARY: 최상위 쿼리
- DERIVED: 서브쿼리나 인라인 뷰에서 생성된 임시 테이블
- SUBQUERY: 서브쿼리의 첫 번째 SELECT문
- UNION: UNION의 두 번째 이후 SELECT문
- DEPENDENT SUBQUERY: 상위 쿼리에 의존적인 서브쿼리
- table: 조회한 테이블 명 또는 별칭
- partitions: 액세스 중인 테이블 파티션 정보
- type: 데이터 액세스 방식
- ALL: 테이블 풀 스캔
- INDEX: 인덱스 풀 스캔
- RANGE: 인덱스 레인지 스캔
- REF: 비 고유 인덱스를 사용한 경우
- EQ_REF: 조인 시 한 테이블의 특정 값이 다른테이블의 PK 또는 UK에 매칭되는 경우 (1대1 관계에서 조인할때 사용)
- CONST: PK 또는 UK로 단 하나의 레코드만 조회
- possible_keys: 사용 가능한 인덱스 목록
- key: 실제 사용된 인덱스 이름
- key_len: 사용된 인덱스의 길이
- ref: 비교에 사용된 값
- rows: 예상 처리 행 수
- filtered: 필터링된 데이터의 비율
- Extra: 추가 작업
- Using where: WHERE 조건을 사용해 데이터를 필터링
- Using index: 테이블 데이터에 접근하지 않고 인덱스만 사용 (커버링 인덱스)
- Using temporary: 중간 결과에 임시 테이블 사용
- Using filesort: 쿼리 실행 중 정렬 작업 수행
힌트(Hint)
힌트란?
- 힌트는 SQL 쿼리 작성 시 데이터베이스 옵티마이저가 특정 방식으로 쿼리를 실행하도록 지시하는 명령어
- 쿼리 최적화가 필요하거나, 옵티마이저의 기본 선택이 비효율적일 때 사용
- 힌트는 쿼리의 일부로 사용되며, 데이터베이스가 실행 계획을 수립할 때 참고함
MySQL 예시:
SELECT * FROM employees FORCE INDEX (idx_salary) WHERE salary > 50000;
힌트 사용하는 이유
- 옵티마이저의 기본 선택을 우회
- 특정 인덱스 강제 사용 지시
- 조인 순서 및 방식 제어 명시적으로 지정