본문 바로가기
공부

데이터베이스 인덱스 1 - 인덱스 개념, 종류 등

by eunyoung 2023. 5. 31.

데이터베이스 인덱스란?


데이터베이스에서 데이터의 조회 속도를 높일 수 있는 자료구조이고, 주로 where 절에서 사용된다.

 

인덱스의 사전적인 의미로는 색인이다.

색인은 쉽게 찾아볼 수 있도록 일정한 순서에 따라서 놓은 목록을 말한다.

 

책으로 비유하자면 목차에 비유할 수 있다.

우리가 책에서 원하는 내용을 찾는다고 가정하면, 책의 모든 페이지를 찾아보는 것은 시간이 많이 걸린다.

이를 위해서 책의 뒷편에는 핵심 키워드 기준으로 그 키워드가 어느 페이지에 있는지 알려주는 페이지가 있다,

 

즉, 데이터베이스에서도 데이터를 조회하기 위해서 모든 테이블을 다 탐색하면 시간이 오래 걸리므로 데이터와 데이터의 위치를 저장해두는 자료구조를 따로 생성해서 이를 통해서 빠르게 데이터 조회가 가능하도록 한다.

 

이것이 바로 데이터베이스의 인덱스이다.

 

 

 

인덱스를 사용하는 이유는?


인덱스는 select 컬럼 from 테이블 where 검색 조건 쿼리와 같이 where 조건을 통해서 검색을 할때 인덱스 효과를 볼 수 있다.

 

만약 where절을 이용해서 데이터를 조회하는 검색 쿼리에서 인덱스를 사용하지 않는다면 테이블 풀 스캔(FULL TABLE SCAN)이 일어난다.

 

테이블 풀 스캔은 원하는 데이터를 찾기 위해서 테이블의 모든 행을 다 조회하는 방식이다.

 

이런 풀 테이블 스캔 방식은 디스크 I/O 비용이 많이 발생하여 대량의 데이터를 처리할때는 시스템 성능을 나쁘게 할 수 있다.

 

 

인덱스 사용의 장점과 단점


인덱스 사용의 장점은?

1. 검색 속도가 빨라질 수 있다(항상 그런 것은 아니다) -> 전체 시스템 향상으로 이어질 수 있다.

 

 

인덱스 사용의 단점은?

1. 인덱스를 관리하기 위해서 DB의 약 10%에 해당하는 저장공간이 따로 필요하다.

 

2. 인덱스를 관리하기 위해서 추가 작업이 필요하다.

 

3. 인덱스를 잘못 사용할 경우 오히려 성능 저하가 발생할 수 있다.(insert와 update가 자주 발생하는 경우)

 

 

 

인덱스의 종류


실제 인덱스의 종류로는 크게 2가지가 있다.

 

클러스터링 인덱스와 논 클러스터링 인덱스가 있다.

 

클러스터링 인덱스

실제 데이터가 정렬되어 있는 것을 말한다.

비유하자면, 클러스터링 인덱스는 "영어 사전"과 같은 책이다.

 

실제 데이터와 같은 무리를 이루는 인덱스이다.

따라서, 클러스터링 인덱스는 테이블당 한개만 생성할 수 있다.

 

  • 클러스터링 인덱스 생성 방법

    Primary 키 제약 조건을 거는 방법 : Primary 키 제약 조건이 걸려있는 열 기준으로 정렬이 된다.

    unique not null 제약 조건을 거는 방법

 

 

논 클러스터링 인덱스(보조 인덱스, 세컨더리 인덱스)

실제 데이터와 다른 무리를 이루는 별도의 인덱스이다.

비유하자면, 논 클러스터링 인덱스는 책 뒤의 <찾아보기> 페이지 같은 것이다.

 

실제 데이터와 다르게 별도의 공간에 생성되므로 추가 공간이 별도로 필요하다.

 

논 클러스터링 인덱스는 테이블 당 여러 개를 생성할 수 있다.

 

  • 논 클러스터링 인덱스 생성 방법

    unique 제약 조건을 건다.

    create index 명령어와 같이 직접 index를 생성하는 방법

 

 

인덱스 대상 컬럼 선택 기준은? 


인덱스 대상 컬럼 선택 기준은 대표적으로 카디널리티가 있다.

 

카디널리티란?

해당 컬럼의 그룹 내 요소의 개수를 말한다.
즉, 해당 컬럼의 고유의 값의 수를 말한다.

카디널리티가 높다는 것은 중복 수치가 낮다는 것을 의미한다.

예를 들어, 성별과 같은 컬럼은 중복 수치가 높으므로 카디널리티가 낮은 컬럼이고, 주민등록번호와 같은 컬럼은 중복 수치가 낮으므로 카디널리티가 높은 컬럼이다.

 

성별과 같이 카디널리티가 낮은 데이터에 인덱스를 적용하면 검색 결과가 거의 모든 데이터일 확률이 매우 높다.

따라서 이런 경우는 따로 별도로 인덱스를 사용해서 조회하는 것의 효과를 별로 느낄 수 없을 수도 있다.

 

반면, 성별과 달리 주민등록번호와 같은 컬럼은 경우가 다르다.

주민등록번호와 같이 카디널리티가 높은 데이터에 인덱스를 적용하면 해당 주민등록번호를 가진 사람만 인덱스를 사용해서 조회하므로 데이터를 처음부터 끝까지 탐색하는 테이블 풀 스캔하는 것보다 빠르게 조회할 수 있다.

 

따라서 인덱스를 적용하려는 컬럼을 선택할때에는 카디널리티를 고려해서 카디널리티가 높은 컬럼에 인덱스를 적용해주는 것이 검색 성능 향상에 도움을 줄 수 있다.

'공부' 카테고리의 다른 글

Git amend, reset, revert, cherrypick, rebase  (0) 2024.07.21
리액티브 프로그래밍(Reactive Programming)  (0) 2024.05.11
웹 브라우저에서 www.google.com을 입력했을때  (0) 2023.05.28
CORS란?  (0) 2023.05.28
자바의 GC  (2) 2023.05.08