인덱스

Inyeob Kim·2023년 3월 20일

1. 인덱스란?

데이터의 고유성을 확인하거나 검색 성능을 향상시키기 위해 사용하는 객체

특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 공간에 데이터의 물리적 주소와 함께 저장한다. 인덱스를 생성할 때 수행하는 정렬 작업은 이후 해당 데이터를 빠르게 검색하는 데 중요한 역할을 한다. 왜냐하면 무작위로 입력된 데이터에 비해 정렬된 데이터는 선후관계를 파악할 수 있어 불필요한 데이터를 읽지 않고 원하는 데이터에만 접근할 수 있도록 도와주기 때문이다.

책은 보통 맨 뒤에 색인이라는 것을 제공한다. 키워드가 되는 단어들을 중심으로 책의 내용을 찾을 수 있도록 돕는 역할을 하는 것이다. 바로 이 색인의 기능이 인덱스와 그것과 유사하다.

인덱스를 분류하는 기준에 따라 다음과 같이 다양하게 나뉜다.

  • 인덱스 컬럼 값의 유일성: UNIQUE/NON-UNIQUE
  • 인덱스를 구성하는 컬럼의 수: 단일 인덱스/결합 인덱스
  • 인덱스의 물리적 구성 방식: B*Tree/BITMAP/CLUSTER

1.1 B*Tree 인덱스의 개념 및 작동원리

우리가 흔히 말하는 인덱스는 대부분 밸런스드 트리 인덱스를 의미한다.

(1) B*Tree 인덱스의 구조

  • 오라클뿐만 아니라 다른 관계형 DBMS에서도 많이 사용하는 가장 보편적인 인덱스
  • 나무처럼 뿌리 - 줄기 - 잎의 구조를 갖음
  • 특정 컬럼에 인덱스를 생성하는 순간, 컬럼의 값들을 정렬함
  • LEAF 블록에 인덱스의 키가 되는 데이터와 데이터의 물리적 주소 정보인 ROWID를 저장함.
  • ROOT 블록 -> DEPTH 0
  • B*Tree 인덱스는 언제나 균형이 맞음. 이는 곧, 모든 LEAF 블록이 동일한 DEPTH에 존재한다는 뜻
  • B*Tree 인덱스의 키 데이터가 테이블에서 UPDATE가 되면, 인덱스에서는 DELETE와 INSERT를 하는 것으로 처리됨.

(2) B*Tree 인덱스의 동작

인덱스의 가장 중요한 기능은 데이터의 조회 속도를 빠르게 하는 것.

B*Tree 인덱스 ROOT 블록을 시작으로 BRANCH 블록, LEAF 블록의 순서로 데이터를 검색하는데, 얼마나 많은 BRANCH 블록과 LEAF 블록을 경유할지는 조건의 유형 (INDEX SCAN 의 방식을 결정짓는 요소)에 따라 결정됨.

INDEX UNIQUE SCAN

  • 인덱스를 사용한 검색 방식 가운데 가장 빠름
  • 인덱스를 구성하고 있는 모든 컬럼이 조건절에서 '='로 비교되어야함
  • 조인되는 테이블과의 조인 조건에도 UNIQUE INDEX 또는 기본키 컬럼이 모두 조인에 참여했을때만 가능

UNIQUE INDEX?
https://araikuma.tistory.com/699

INDEX RANGE SCAN

인덱스를 사용해 인덱스가 생성된 컬럼에 대해 범위 검색을 하는 방법이다.

UNIQUE INDEX를 사용하지 않거나 비교연산자를 사용한 대다수의 경우가 이 방식으로 처리되는데, 비교연산자로는 <,<=,>,>=, BETWEEN, LIKE 등이 사용될 수 있다. 검색된 데이터는 오름차순 또는 내림차순으로 정렬하여 출력할 수 있다.

INDEX SKIP SCAN

결합 인덱스의 선행 컬럼에 대한 조건이 없고 후행 컬럼에 대한 조건만 있는 경우 적용된다.

INDEX FULL SCAN

조건절에서 인덱스 컬럼 중 하나 이상을 사용한 경우 또는 SQL에서 사용한 컬럼들이 모두 하나의 인덱스에 존재할 경우 적용되는 방식이다.

이 가운데 SQL에서 사용한 컬럼들이 모두 하나의 인덱스에 존재할 경우, 인덱스를 구성하는 컬럼 중 최소한 하나의 컬럼은 NOT NULL 제약 조건을 충족해야 한다.

INDEX FAST FULL SCAN

SELECT 절과 조건절에 사용된 모든 컬럼이 인덱스 컬럼으로 구성되어 있어 테이블을 검색하지 않고 인덱스의 블록만을 스캔하여 원하는 데이터를 검색하는 방식이다.

생성구문

CREATE INDEX index_name
ON table_name(col_name1, col_name2, ...);

드라이빙 테이블 결정 규칙 (아래 링크 참고)
https://devuna.tistory.com/36

데이터베이스 분포도 (아래 링크 참고)
https://jdm.kr/blog/169

참고도서: 실전사례로 살펴보는 SQL 튜닝 비법

profile
코어뱅킹 주니어 개발자

0개의 댓글