본문 바로가기
💾 데이터베이스(Database)/Index

[Index] 인덱스(index) 알아보기

by inbeom 2023. 8. 27.
728x90
반응형

인덱스란?

인덱스 => 색인

색인은 쉽게 찾아볼 수 있도록 일정한 순서에 따라 놓은 목록으로 색인을 데이터베이스에 적용한 것이 인덱스 라고 할 수 있다.

즉, 인덱스란 데이터베이스 테이블에 대한 검색 성능을 향상시키는 자료 구조이며 WHERE절 등을 통해 활용된다.

 

특징

1. 인덱스는 항상 최신의 정렬상태를 유지

2. 인덱스도 하나의 데이터베이스 객체

3. 데이터베이스 크기의 약 10% 정도의 저장공간 필요

 

 

인덱스 알고리즘

페이지 (Page):

데이터가 저장되는 단위 (16 Kbyte)

 

Pull Table Scan:

처음부터 순차적으로 모든 페이지를 스캔하는 방법

 

특징

1. 순차적으로 접근

2. 접근 비용 감소

 

사용 시점

1. 적용 가능한 인덱스가 없는 경우

2. 인덱스 처리 범위가 넓은 경우

3. 크기가 작은 테이블에 엑세스 하는 경우

 

 

이진 탐색 트리 (Binary Search Tree):

이진탐색 + 연결리스트의 장점을 합친 알고리즘이다. 

시간복잡도의 단점을 보완하기 위해 B-Tree와 같은 자료구조들이 만들어졌다. 

 

B-Tree (Balanced-Tree):

트리높이가 같으며, 자식 노드를 2개이상 가질수 있는 자료구조 이다. (기본 데이터베이스 인덱스 구조)

B-Tree를 적용하면 Pull Table Scan방법에 비해 효율적으로 검색할 수 있다.

 

인덱스 적용 시 검색 횟수 >

인덱스 적용 시 단점

인덱스를 적용한 테이블에서 Insert, Update, Delete 작업을 하면 페이지 분할과 데이터 사용안함 표시 등의 이유로 인덱스의 조각화가 심해져 오히려 성능이 저하될 수 있기 때문에 데이터의 변경이 많지 않고 비교적 규모가 큰 데이터베이스에 적용하는 것이 좋다.

 

 

인덱스 종류

클러스터링 인덱스

클러스터(Cluster)란 무리, 군집, 무리를 이룬다는 뜻으로 클러스터링 인덱스는 실제 데이터와 같은 무리를 이룬다. 즉, 실제 데이터가 정렬된 사전을 뜻한다.

  • 데이터를 물리적으로 정렬하여 디스크에 저장하는 방식
  • 특정 열의 값을 기반으로 행을 정렬한다
  • 클러스터링 인덱스를 가지고 있는 열은 그 자체로 데이터를 물리적으로 정렬하므로, 클러스터링 키(PK) 값을 기반으로 행을 정렬한다. (그렇기 때문에 하나의 테이블에는 하나의 클러스터링 인덱스만 존재)
인덱스는 따로 생성하지 않아도 한 테이블의 컬럼에 Primary Key, Unique 제약조건이 걸려있으면 자동으로 생성된다.

 

클러스터링 인덱스 추가 방법 >

-- 방법1. (PrimaryKey)
ALTER TABLE member
ADD CONSTRAINT pk_id PRIMARY KEY (id);

-- 방법2. (Unique + NotNull)
ALTER TABLE member MODIFY COLUMN id int NOT NULL;
ALTER TABLE member ADD CONSTRAINT nuq_id UNIQUE (id);

 

 

 

 


논-클러스터링 인덱스

논-클러스터링 인덱스는 실제 데이터와 같은 무리를 이루지 않는다. 즉, 데이터 탐색에 도움을 주는 별도의 색인 페이지를 뜻한다.

  • 물리적 데이터와는 독립적으로 별도의 인덱스 구조를 생성하는 방식
  • 인덱스만을 정렬하여 저장하므로, 특정 열에 대한 빠른 검색을 가능하게 한다
  • 하나의 테이블에 여러 개의 논-클러스터링 인덱스를 생성할 수 있다

 

논-클러스터링 인덱스 추가 방법 >

-- 방법1. (Unique)
ALTER TABLE member
ADD CONSTRAINT unq_name UNIQUE (name);

-- 방법2. (UniqueIndex)
CREATE UNIQUE INDEX unq_idx_name
ON member (name);

-- 방법3. (Index)
CREATE INDEX idx_name
ON member (name);

 

 

차이점:
클러스터링 인덱스는 리프페이지와 데이터페이지가 같아 루트에서 바로 접근하고, 논-클러스터링 인덱스는 데이터페이지가 따로 저장되있어 루트에서 리프페이지를 타고 리프에서 데이터의 위치를 찾아 데이터에 접근한다. 

 

클러스터링 & 논-클러스터링 인덱스를 같이 적용하면?
- 논 클러스터링 인덱스의 리프 페이지에 실제 데이터 주소가 아닌 클러스터링 인덱스가 적용된 컬럼의 실제 값(PK)이 저장된다.

 

 

인덱스 적용 기준

어떤 컬럼에 인덱스를 적용해야 할까?

카디널리티 (Cardinality): 그룹 내 요소의 개수

=> 카디널리티가 높은 컬럼. 즉, 중복 수치가 낮은 컬럼에 적용하는 것이 효과적이다. (id, email, phone 등)

 

  1. 카디널리티가 높은 (중복도가 낮은) 컬럼
  2. WHERE, JOIN, ORDER BY 절에 자주 사용되는 컬럼 (조건 절이 없다면 인덱스가 사용되지 않는다)
  3. INSERT / UPDATE / DELETE 등 데이터의 변경이 자주 발생하지 않는 컬럼
  4. 규모가 작지 않은 테이블

 

 

 

reference.

https://www.youtube.com/watch?v=edpYzFgHbqs  

728x90
반응형

'💾 데이터베이스(Database) > Index' 카테고리의 다른 글

[Index] index 사용 방법  (0) 2023.08.27
[Index] 인덱스 종류와 자료구조  (0) 2023.08.27