본문 바로가기

Etc

[DATABASE] Index 에 대해 알아보자

데이터베이스에는 인덱스(Index)라는 개념이 있다.

데이터를 효율적으로 저장해서 데이터를 검색할 때 매우 빠른 속도로 검색이 가능하도록 인덱스를 지정해주는 것이다.

예를 들어 회원정보를 저장하는 테이블이 있고, 이름을 기준으로 검색을 한다고 했을때

만약 테이블이 이름을 기준으로 정렬된채로 저장되어 있다면 검색할 때 속도가 아주 빠를 것이다.

 

다만 인덱스를 설정한 다는 것이 단순히 데이터를 정렬된 채로 저장하는게 아니고

B+Tree 또는 B-Tree 형식으로 트리 구조로 저장하는 것이다.

저 둘에 대해서는 다음에 알아보자.

하여간 트리 구조로 저장해서 탐색할 때 용이하게 한다.

 

그러면 인덱스를 설정하는게 무조건 좋은가?

물론~~~ 아니다 !!

인덱스 설정에도 단점이 있다.

 

1. 인덱스를 저장하기 위해 추가적인 저장공간이 필요하다.

2. 테이블에 삽입, 수정, 삭제 쿼리가 빈번할 경우 성능이 저하된다.

 

따라서 무분별한 인덱스 설정은 해서는 안되며, 꼭 테이블의 특성과 용도를 파악해서 필요한 경우에만 인덱스를 설정해야한다.

 

그럼 바로 인덱스를 설정하는 방법에 대해 알아보자.

MS-SQL 문법으로 보면

 

1. CLUSTERED INDEX

CREATE CLUSTERED INDEX [인덱스 명] ON [테이블 명]([컬럼 명] [정렬 기준])

 

2. UNIQUE CLUSTERED INDEX

CREATE UNIQUE CLUSTERED INDEX [인덱스 명] ON [테이블 명]([컬럼 명] [정렬 기준])

 

3. NONCLUSTERED INDEX

CREATE NONCLUSTERED INDEX [인덱스 명] ON [테이블 명]([컬럼 명] [정렬 기준])

 

4. UNIQUE NONCLUSTERED INDEX

CREATE UNIQUE NONCLUSTERED INDEX [인덱스 명] ON [테이블 명]([컬럼 명] [정렬 기준])

 

 

이렇게 인덱스를 설정하고 우리가 흔히 알고 있는 SELECT 쿼리를 날리면 매우 빠르게 검색이 이루어진다.

물론 WHERE 절에서 인덱스를 설정한 컬럼을 기준으로 검색해야한다.

 

그러면 당연히 드는 생각

CLUSTERED, NONCLUSTERED, UNIQUE 는 각각 무슨 차이일까?

아주 잘 정리해놓은 블로그를 참조한다.

https://blog.naver.com/jaehoyaa/221492718692

 

일단 쉬운 것 부터

UNIQUE 는 대략적으로 느낌이 온다.

인덱스로 설정한 컬럼이 유니크한 값을 갖는다면 UNIQUE 로 인덱스를 설정한다.

당연하게도 컬럼의 값들이 유니크하지 않다면 UNIQUE 로 인덱스를 설정할 수 없다.

또 UNIQUE 로 설정할 때와 안했을 때, 인덱스 저장 방법이 다르다.

어떻게 다른지는 역시 다음에 알아보자...

 

CLUSTERED 는 인덱스로 설정한 컬럼에 의해 데이터가 정렬된다.

NONCLUSTERED 는 데이터는 그대로고 인덱스만 정렬된다.

 

CLUSTERED 의 경우에는 컬럼을 기준으로 데이터가 정렬되고,

데이터 페이지마다 인덱스를 나누어 관리한다.

그리고 검색을 할 때는 몇번 째 데이터 페이지에 데이터가 존재하는지 찾아가고 해당 데이터 페이지 내에서 탐색을 해 데이터를 찾는다.

 

NONCLUSTERED 는 인덱스만 정렬해서 관리한다.

그래서 인덱스 페이지 내에서 데이터의 위치를 알아내고, 데이터 페이지로 즉시 접근해서 검색을 완료한다.

 

CLUSTERED 는 데이터 페이지 자체를 정렬하기 때문에 한 테이블 내에 하나의 CLUSTERED INDEX 만 존재할 수 있다.

또 데이터 페이지가 정렬되는 것이기 때문에 검색 기능에 대해서는 NONCLUSTERED 보다 속도가 빠르다.

단, 삽입, 수정, 삭제 쿼리에 대해서는 속도가 더 느리다.

CLUSTERED INDEX 를 설정하면 데이터 페이지를 정렬하기 때문에 만약 이미 대용량의 데이터가 들어있는 테이블에 인덱스를 설정한다면 신중히 진행해야 한다.

 

반면 NONCLUSTERED INDEX 는 여러 개를 지정할 수 있다.

다만 그렇다고 해서 무분별하게 생성하면 오히려 성능이 떨어질 수 도 있으니 역시 신중하게 인덱스를 지정해야한다.

 

마지막으로 인덱스 조회, 삭제 명령어도 알아보자

 

인덱스 조회

SP_HELPINDEX [테이블 명]

 

인덱스 삭제

DROP INDEX [테이블 명].[인덱스 명]

'Etc' 카테고리의 다른 글

[Network] HTTP 통신과 Socket 통신  (0) 2021.09.06