인덱스 (index) (2)

2024. 11. 15. 20:05·DB

인덱스 스캔 방식

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
'DB' 카테고리의 다른 글
  • 트랜잭션 ACID 원칙
  • 낙관적 락 과 비관적 락
  • 인덱스 (Index)
  • 순차 IO / 랜덤 IO
CoMeangMeangIn
CoMeangMeangIn
코딩하는 코맹맹이
  • CoMeangMeangIn
    CoMeangMeangIn
    CoMeangMeangIn
  • 전체
    오늘
    어제
    • 분류 전체보기 (22)
      • java (3)
        • spring (1)
        • build (1)
      • DB (16)
      • 알고리즘 (1)
      • 회고 (1)
      • git (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
CoMeangMeangIn
인덱스 (index) (2)
상단으로

티스토리툴바