[SQLD] 인덱스 (Index)

yjkim97·2023년 9월 1일

자격증

목록 보기
21/24
post-thumbnail

인덱스 (Index)

  • 원하는 데이터를 쉽게 찾을 수 있도록 도와줌
  • 검색 성능의 최적화가 목적

1. 인덱스 특징

  • 인덱스틑 인덱스 구성 칼럼으로 정렬되어 있음 (default : 오름차순 정렬)
  • 인덱스는 ASC or DESC 탐색이 가능
  • 하나의 테이블에 여러 인덱스 생성이 가능
  • 하나의 인덱스는 여러개의 컬럼으로 구성 가능
  • PK는 자동으로 인덱스 생성됨
  • 인덱스 생성시 CREATE INDEX ...문 사용

주의사항

  • ⭐️ 인덱스로 인해 삽입,삭제,갱신 등의 DML 작업 효율이 저하될 수 있음
  • ⭐️ 대량의 데이터 삽입시 모든 인덱스를 제거하고 데이터 삽입이 끝난 후 인덱스를 다시 생성하는 것이 좋다.
    (그렇지 않으면 매번 인덱스 정렬을 수행함)
  • 인덱스 구성하는 컬럼 순서 매우 중요하다.

⭐️ 인덱스 스캔이 전체 스캔보다 항상 빠른 것은 아니다!!
대용량 데이터를 읽을 경우에는 인덱스 스캔보다 테이블 전체 스캔이 유리할 수도 있다.

⭐️ insert, delete 작업과 다르게 update 작업에서는 부하가 없을 수도 있다???
인덱스 구성하는 컬럼 이외의 데이터가 update될 때는 인덱스로 인한 부하가 발생하지 않는다.

2. 인덱스 종류

인덱스 종류설명
Balance Tree- RDB에서 가장 많이 사용되는 인덱스
B-Tree- 브랜치 블록과 리프 블록으로 구성
- 브랜치 블록 : 분기를 목적
- 리프 블록 : 인덱스를 구성하는 컬럼의 값으로 정렬
- 일반적으로 OLTP 시스템 환경에서 가장 많이 사용
- 일반적으로 테이블 내의 데이터중 10%이하의 데이터를 검색할 때 유리하다.
- 일치 및 범위 검색에 적절한 인덱스이다.
CLUSTERED- 인덱스의 리프 페이지가 곧 데이터 페이지
- 리프 페이지의 모든 데이터는 인덱스 키 컬럼 순으로 물리적으로 정렬되어 저장
- SQL Server 클러스터형 인덱스
BITMAP- DW 및 AD-HOC 질의 환경을 위해서 설계
- 하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 잇는 구조

인덱스 구조

  • 브랜치 블록
  • 리프 블록 : 인덱스 구성하는 컬럼, 레코드 식별자(해당 데이터를 가지고 있는 행의 위치)로 구성
  • 루트 블록

3. 인덱스 스캔

인덱스 스캔은 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 액세스 기법이다.

스캔 종류설명SQL
인덱스 유일 스캔 (Index Unique SCAN)- 인덱스 키 값이 중복되지 않는 경우
- 특정한 하나의 행을 조회함
SELECT * FROM 테이블 WHERE idx컬럼 = 1001;
인덱스 범위 스캔 (Index Range SCAN)- 인덱스 Leaf Block의 특정 범위를 스캔
- 범위 조회 WHERE문, LIKE, BETWEEN
SELECT * FROM 테이블 WHERE idx컬럼 >= 1001;
인덱스 전체 스캔 (Index Full SCAN)- 검색되는 인덱스 키가 많은 경우
- Leaf Block의 처음~끝까지 전체를 읽음
SELECT * FROM 테이블 WHERE idx컬럼 Like '%' AND idx컬럼 > 0;
profile
어제는 🐸두꺼비 오늘은 😄YJ

0개의 댓글