데이터베이스에는 인덱스(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 |
---|