인덱스(Index)란?

이리·2024년 3월 28일
0

오늘 카카오 클라우드 스쿨 면접을 보며 인덱스(index)란 무엇인가? 라는 질문을 받았다.
평소 SQLD와 정보처리기사 데이터 베이스를 준비하며 데이터베이스만큼은 알고 있다고 생각했지만, 이러한 질문에 명쾌하게 답하지 못하는 내 자신을 보며 안타까움을 느꼈다...

그럼 인덱스란 무엇인지에 대해 자세하게 알아보자


컴퓨터는 자료를 검색하는데 처음부터 차례대로 검토하기 때문에(Fullscan) 대규모로 분산되어 있는 데이터에서 자료를 찾는 것은 매우 비효율적이다. 이러한 부분을 해결하기 위한 방법 중 하나가 Index로 실제로 데이터에 추가적인 저장공간에 위치 정보를 저장하여 조금 더 효율적으로 찾는 방식을 말한다.

인덱스의 정의

데이터 베이스 테이블 검색 속도 향상을 위한 저장 공간 활용 자료구조
책의 색인과 유사하며, 빠른 조회를 위해 데이터 위치 정보를 포함하는 것
( index = 정렬해 놓은 컬럼 사본 )

인덱스 장,단점

장점

  • 대규모 테이블에서의 빠른 데이터 추출
  • 조건 검색, 정렬, MIN/MAX 처리의 효율 향상
  • JOIN 시 열 추출 효율성 증가

즉,

  • index 없는 경우 : 모든 행을 다 뒤짐 (Fullscan)
  • index 있는 경우 : index 에서 찾으려는 값을 찾고 index와 연결된 원래 테이블 행을 찾음

단점
1. 기존 테이블을 복사하기 때문에 추가적인 저장공간 필요(10~15%)
2. 기존 테이블을 insert, update, delete 작업을 할 경우 추가적인 작업 필요


인덱스의 종류

그럼 인덱스의 정의에 대해 알아봤으니 인덱스의 종류에 대해 알아보자

1. 클러스터 인덱스(Cluster Index)

  • 테이블 당 한개만 허용되며, 해당 칼럼을 기준으로 테이블이 물리적으로 정렬
  • 기본적으로 오름차순으로 정렬을 진행
  • 기본키 -> 자동 클러스터드 인덱스 적용
  • 데이터 입력, 수정, 삭제 시 항상 정렬 상태를 유지
  • 비클러스터형 인덱스보다 검색속도는 빠르지만, 삭제,수정시 느려짐 ( 계속 정렬상태를 유지해야해서..)
  • 리프 페이지는 곧 데이터

2. 넌클러스터 인덱스

  • 테이블 당 240개의 인덱스 생성 가능
  • 원본은 정렬되지 않고 인덱스 페이지만 정렬
  • 리프 페이지는 곧 데이터 포인터

3. 밀집 인덱스

  • 데이터 레코드 각각에 대해 하나의 인덱스가 만들어짐

4. 희소 인덱스

  • 레코드 그룹 또는 데이터 블록에 대해 하나의 인덱스가 만들어짐

인덱스의 구조

그럼 인덱스는 어떤 구조로 작동되는 것일까? 어떻게 자료를 더 빨리 찾을 수 있는가?
그 원리는 아래와 같다

  1. 트리 기반 인덱스
  • 대부분 DBMS는 검색 효율 상승을 위해B+ 트리 인덱스를 사용한다.
  • B+ 트리는 밸런스가 잘 맞춰진 트리로 루프에서 리프까지 모든 경로의 깊이가 동일하다.
  • 이는 곧 삽입, 삭제, 검색에 효율적임을 의미한다.
  • 데이터는 리프노드에만 존재한다. (각각의 메모리는 디스크에 저장된다. 메모리 X)
  • 특히 범위 검색에 효율적이다!

그럼 B+ 트리란 무엇일까 (B+ 트리 알고리즘) - 잘 설명된 유투브가 있어 <코맹탈출>님의 링크를 남긴다. (나중에 자료구조 정리할때 더 자세하게 다루겠다!)
https://youtu.be/yLe7_3cGSeU?si=TsWLU2dQdOQAhMbF

  1. 비트랩 기반 인덱스
  • 값의 범위가 제한적인 칼럼에 사용, 각 값에 대한 비트 배열을 사용하여 인덱싱
  • 키 값이 있는 로우를 빠르게 인식
  • 읽기 중심 데이터베이스에 유리, 쓰기 환경에서는 성능저하 발생 가능
  1. 함수 기반 인덱스
  • 칼럼 값이 아닌 특정 함수 결과에 대한 인덱싱
  • 복잡한 쿼리 조건을 인덱싱 할 수 있어, 쿼리 성능 향상에 도움
  • 다양한 함수(SQL, 산수, 함수, 패키지 등)을 사용하여 인덱스 구성 가능
  1. 비트맵 조인 인덱스
  • 비트맵 인덱스의 확장, 특정 함수의 결과에 대해 인덱스를 생성
  • 한 테이블의 칼럼이 아닌, 조인된 다른 테이블의 칼럼 값을 인덱싱
  • 조인된 테이블의 데이터 변화에 따라 인덱스를 재구성해야 할 수 있음.
  1. 도메인 인덱스
  • 사용자 정의 인덱스로, 특정 애플리케이션에 특화된 인덱싱 구현 가능

간단한 인덱스 구문을 추가한다!
CREATE INDEX [인덱스 명] ON [테이블 명] (칼럼1, 칼럼2, 칼럼3 ...) ;
DROP INDEX 인덱스 명;
ALTER INDEX 인덱스 명 REBUILD; ->인덱스 재구성

profile
Bonjour!

0개의 댓글