데이터베이스에서 테이블에 대한 동작속도를 높여주는 자료구조이다.
데이터베이스에서 말하는 index는 책에 비유하면 목차이다 데이터의 위치를 가르키는 지표와 같은 것.
따라서 빠른 시간내에 원하는 자료를 찾을 수 있다.
데이터베이스에서 index의 구조는 크게 clustered index와 non-clustered index로 나뉜다.
| id | name | age |
|---|---|---|
| 1 | 가 | 2 |
| 2 | 다 | 1 |
| 3 | 라 | 4 |
| 4 | 나 | 3 |
이 표와 같이 유저 라는 테이블이 있다고 가정할 때
개발자는 id값이 아닌 name으로 정렬을 하고 싶다고 생각 하거나 name으로 조회하는 경우가 많다고 가정을 하면
Non-Clustered Index를 활용하는 방법이 있다.
create index 이름인덱스 on 유저테이블(name);
워크벤치나 커맨드 라인으로 해당 명령어를 써주면
| id | name | age |
|---|---|---|
| 1 | 가 | 2 |
| 4 | 나 | 3 |
| 2 | 다 | 1 |
| 3 | 라 | 4 |
이런식으로 정렬이 된다.
예시로 유저 이름으로 걸었지만, 실제로 유저의 이름으로 걸면 좋지 않다. (중복값이 많으면 성능이 좋지 않음)
실제로 name컬럼에 중복값이 들어간다면
| id | name | age |
|---|---|---|
| 1 | 가 | 2 |
| 4 | 나 | 3 |
| 2 | 다 | 1 |
| 3 | 라 | 4 |
| 5 | 라 | 5 |
이름으로는 정렬이 되지만 다음 정렬될 테이블을 예측하기 힘들다. (id값이나 age값이 뒤죽박죽이 될 수 있음)
create index 이름아이디인덱스 on 유저테이블(name, id);
따라서 이렇게 두개를 걸면 되긴 하지만 왠지모르게 두개를 동시에 인덱스를 걸면 뭔가 성능이 떨어질거같아 불안하다.
그러므로 인덱스를 걸 때에는 중복이 적고 조회가 잦은 인덱스를 선정하는것이 좋다. (예를들어 대체 인덱스로 username이나 email 추가)
| 특징 | 클러스터드 인덱스 | 논클러스터드 인덱스 |
|---|---|---|
| 정의 | 데이터가 정렬된 순서로 저장되는 인덱스 | 데이터와 별도로 저장되는 인덱스 |
| 구조 | 테이블의 실제 데이터가 인덱스에 포함됨 | 인덱스에 데이터의 포인터(주소)만 포함됨 |
| 속도 | 조회 속도가 빠르며, 범위 검색에 유리 | 특정 컬럼에 대한 조회가 빠르지만, 정렬된 검색 시 성능 저하 가능 |
| 기본키(PK) | 기본적으로 테이블당 하나만 존재할 수 있음 | 여러 개의 인덱스를 생성할 수 있음 |
| 사용 예시 | 주로 기본 키나 자주 조회되는 컬럼에 사용 | 자주 검색되는 비주요 컬럼에 사용 |
| 공간 효율성 | 데이터와 인덱스가 동일하므로 공간 효율적 | 인덱스와 데이터가 분리되어 공간이 더 필요 |
| 변경 비용 | 데이터 삽입/삭제 시 성능 저하 발생 가능 | 인덱스 추가 및 삭제 시 비용이 발생 |
| 특이점 | 데이터 양이 많아지면 성능 저하가 발생할 수 있음 | 많은 인덱스를 걸 경우 업데이트 성능 저하 가능 |