데이터를 빠르게 찾을 수 있는 하나의 장치고, 데이터베이스 테이블에 대한 검색 속도를 높여주는 자료구조입니다. 인덱스를 설정하면 테이블 안에서 찾고자 하는 데이터를 빠르게 찾을 수 있습니다.
인덱스는 주로 B-트리라는 자료구조로 이루어져 있습니다. B-트리는 루트노드, 리프노드, 루트노드와 리프노드 사이에 있는 프브랜치 노드로 나뉩니다.
찾고자하는 데이터가 있다면, 전체 테이블을 탐색하는 것이 아니라, 해당 데이터가 있을만한 리프노드로 들어가서 데이터를 찾는다면 빠르게 찾을 수 있습니다. 이러한 방식으로 탐색에 필요한 시간을 줄일 수 있습니다.
데이터가 정렬이 되어있어서 검색할 때 굉장히 효율적입니다.
where절의 효율성
인덱스 테이블에서는 데이터가 정렬되어 있어 조건(where)에 맞는 데이터를 빠르게 찾을 수 있습니다. 일반적으로 데이터를 만들고 저장한다면 따로 정렬되어 있지 않아서, 특정 데이터를 찾으려면 테이블을 모두 탐색해야 합니다.
order by절의 효율성
인덱스를 사용하면 order by에 의한 sort과정을 피할 수 있습니다. order by는 부하가 많이 걸리는 작업으로, 때때로 I/O도 추가적으로 발생합니다. 인덱스를 사용한다면 이미 정렬되어있기 때문에, 이러한 정렬 과정을 피할 수 있습니다.
MIN/MAX 처리의 효율성
이미 데이터가 정렬되어 있기 때문에 테이블의 시작값과 끝 값 하나씩만 가져오면 되기 때문에 테이블을 모두 스캔할 필요가 없습니다.
효율적인 단계를 거쳐 모든 요소에 접근할 수 있는 균형잡힌 트리 구조와 트리 깊이의 대수확장성 때문입니다.
정렬되어있다는 것이 장점이지만, 반대로 정렬된 상태를 계속 유지시켜줘야 한다는 점이 단점입니다. 데이터가 계속 바뀌는 부분이라면, 데이터가 추가되거나 삭제, 갱신될 때, 인덱스 테이블의 값들을 계속 정렬해주어야 합니다. 원본 테이블과 인덱스 테이블을 모두 데이터를 수정하는 과정도 거쳐야 합니다.
인덱스를 생성하고 관리하기 위해서는 저장 공간이 추가로 필요합니다. 또한, 테이블 전체 데이터 중 10~15% 이하의 데이터를 처리할 때 효율적이고 그 이상의 데이터를 처리할 때는 인덱스를 사용하지 않는 것이 더 낫다고 알려져있습니다.
mysql편
my sql에는 클러스터형 인덱스와 세컨더리 형 인덱스가 있습니다.
클러스터형 인덱스는 테이블 당 하나를 설정할 수 있습니다.
Primary key 옵션으로 기본키를 만들면 클러스터형 인덱스를 생성할 수 있고, 기본키로 만들지 않고 unique not null 옵션을 붙여도 클러스터형 인덱스를 만들 수 있습니다.
create index 명령어를 기반으로 만들면 세컨더리 인덱스를 만들 수 있습니다. 세컨더리 인덱스는 보조 인덱스로, 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야 합니다.
클러스터 인덱스와 세컨더리 인덱스
클러스터 인덱스 : Primary key를 정의하면 클러스터 인덱스
테이블 당 하나
데이터 삽입시 정렬되고, 인덱스는 데이터 블럭의 첫번째 주소값을 가짐. 인덱스가 바로 데이터 블럭에 접근하기 때문에 세컨더리 인덱스보다 동작이 빠름
데이터가 정렬되므로, 범위로 질의하는 것이 유리함. I/O가 덜 발생할 것이기 때문
세컨더리 인덱스 : Primary key 이외에 필요한 정렬 기준이 있을 경우 사용
테이블 당 여러 개
데이터가 정렬되어있지 않음
인덱스가 데이터 레코드의 모든 주소 값을 가지고 있어야 함
유니크(unique)하지 않아도 됨
데이터 레코드가 정렬되어 있지 않아서 범위 조건으로 검색하면 많은 I/O가 발생할 수 있음
인덱스는 모든 레코드에 대한 색인 데이터를 들고 있어야 정렬가능. 따라서 삽입, 삭제, 갱신 시 시간이 더 소요될 수 있으며, 클러스터 인덱스에 비해 공간을 더 차지함
하나의 인덱스만을 생성할 것이라면 대체로 클러스터형 인덱스를 만드는 것이 성능이 좋다고 알려져있습니다.
MongoDB편
도큐먼트를 만들면 자동으로 OBjectID가 형성되고, 이 키가 기본키로 설정됩니다. 세컨더리키도 부가적으로 설정해서 기본키와 세컨더리키를 같이 쓰는 복합 인덱스 설정이 가능합니다.
인덱스 사용 전략
1. 조건절에 자주 등장하는 컬럼
2. 항상 = 으로 비교되는 컬럼
3. 중복되는 데이터가 최소한인 컬럼 = 분포도가 좋은 컬럼
4. Order by 절에서 자주 사용되는 컬럼
5. 조인 조건으로 사용되는 컬럼
이러한 컬럼들에 인덱스를 생성하는 것이 좋습니다.
인덱스의 관리
INSERT : 새로운 데이터에 대한 인덱스를 추가
DELETE : 삭제하는 데이터를 삭제하지 않고, 사용하지 않는다는 작업을 진행
UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 인덱스를 추가