인덱스 스캔 방식
1. INDEX RANGE SCAN
- 인덱스를 이용해 필요한 부분만 탐색하는 방법
- 가장 대표적인 인덱스 탐색방법
- 실행 계획 : INDEX (RANGE SCAN) OF '인덱스명' (INDEX)
- 선두 칼럼을 가공하지 않은 상태로 조건절에 사용
2. INDEX FULL SCAN
- 인덱스를 전부 탐색하는 수평적 탐색 방법이다.
- 실제 데이터까지 가진 않는 경우도 있어 더 빠를 순 있지만 인덱스를 사용하는 의미가 없기 때문에 차선책으로 등장했다.
- 실행 계획 : INDEX (FULL SCAN) OF '인덱스 명' (INDEX)
3. INDEX UNIQUE SCAN
- 등호(=)를 사용한 경우 수행되는 기법이다
- 수직적으로만 탐색을 하는 방법
- 실행 계획 : INDEX (UNIQUE SCAN) OF '인덱스명' (INDEX)
4. INDEX SKIP SCAN
- 인덱스 선두컬럼을 조건절에 사용하지 않으면 옵티마이저는 기본적으로 FULL TABLE SCAN을 수행한다.
- 하지만 FULL TABLE SCAN 보다 IO가 적어지거나 정렬된 데이터를 쉽게 얻을 수 있다면 INDEX FULL SCAN을 사용한다.
- INDEX SKIP SCAN은 이러한 조건에서 DISTINCT 같이 중복제거 질의문이 들어오면 중간에 건너뛰고 진행한다.
- 순차적으로 정렬되지 않은 컬럼에 대해 건너뛸때도 이와같이 사용된다.
5. INDEX FAST FULL SCAN
- INDEX의 논리적 인덱스 트리구조를 무시하고 물리적 저장소에서 인덱스의 세그먼트 자체를 통으로 가져오는 것
- 위와 같은 방식이다 보니 INDEX FULL SCAN 보다 속도가 빠른 장점이 있다.
- 하지만 물리적 저장소에서 바로 가져오다 보니 정렬이 안 돼있다.
- 힌트 : INDEX_FFS, NO_INDEX_FFS
6. INDEX RANGE SCAN DESCENDING
- INDEX RANGE SCAN과 기본적으로 동일하나 내림차순으로 데이터를 가져오는 것
- 실행계획 : INDEX (RANGE SCAN DESCENDING) OF '인덱스명' (INDEX(UNIQUE))
SELECT * FROM EMP
WHERE EMPNO > 0
ORDER BY EMPNO DESC;
쿼리 실행 계획 (Query Plan)
- DBMS 에서 SQL 쿼리를 처리하기 위해 사용하는 방법이다.
- 이것은 DBMS에서 쿼리를 처리할 때 데이터베이스에서 데이터를 검색하고 가져오는 방법을 결정하는데 사용된다.
- 쿼리 실행에 필요한 단계를 보여주며, 각 단계에서 DBMS가 사용하는 액세스 경로를 보여주고, 쿼리 실행에 필요한 리소스 및 비용 정보를 제공한다.
힌트 (HINT)
- SQL 튜닝의 핵심 부분으로 옵티마이저에게 조인이나 경로 탐색 방법들을 알려주는 것을 말한다.
- 항상 DBMS가 자체적으로 최적의 방법을 찾지는 않기 때문에 이를 필요로 한다.
인덱스 동작 확인
- EXPLAIN 명령어:
- 쿼리에서 사용된 인덱스를 확인(key 컬럼).
- type이 range, ref, eq_ref 등의 효율적인 접근 방식인지 확인.
- 쿼리 실행 시간 비교:
- 인덱스를 추가하거나 제거한 상태에서 쿼리 실행 시간을 비교.
- SHOW STATUS로 쿼리 캐시 확인:
- Handler_read_key가 증가하면 인덱스가 사용된 것.
- 실제 실행 확인:
- EXPLAIN ANALYZE를 사용해 실행 시간과 예상 행 수를 비교.
GROUP BY 사용시 인덱스가 걸리는 조건
- GROUP BY 절에 명시된 컬럼이 인덱스 컬럼의 순서와 같아야 한다.
- 아래 모든 케이스는 인덱스가 적용 안된다. (index: a,b,c)
- group by b
- group by b, a
- group by a, c, b
- 인덱스 컬럼 중 뒤에 있는 컬럼이 GROUP BY 절에 명시되지 않아도 인덱스는 사용할 수 있다.
- 아래 모든 케이스는 인덱스가 적용된다. (index: a,b,c)
- group by a
- group by a, b
- group by a, b, c
- 반대로 인덱스 컬럼 중 앞에 있는 컬럼이 GROUP BY 절에 명시되지 않으면 인덱스를 사용할 수 없다
- ex: (index: a,b,c), group by b, c 는 인덱스 적용안됨
- 인덱스에 없는 컬럼이 GROUP BY 절에 포함되어 있으면 인덱스가 적용되지 않는다.
- ex: (index: a,b,c), group by a,b,c,d 는 인덱스 적용안됨
- 이름, 국가, 성별이 있는 테이블에서 인덱스를 어떻게 걸어야할까요?
참고 자료 : https://velog.io/@tothek/%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EA%B8%B0%EB%B3%B8-INDEX-SCAN%EC%A2%85%EB%A5%98, https://velog.io/@ssuh0o0/MySQL-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EC%8A%A4%EC%BA%94
'DB' 카테고리의 다른 글
트랜잭션 ACID 원칙 (0) | 2024.11.18 |
---|---|
낙관적 락 과 비관적 락 (0) | 2024.11.18 |
인덱스 (Index) (1) | 2024.11.15 |
순차 IO / 랜덤 IO (0) | 2024.11.14 |
구조적 질의어 (SQL, Structured Query Language) ( 3 ) (1) | 2024.11.08 |