📙인덱스란?
검색 속도 향상을 목적으로 만드는 하나 이상의 테이블 필드에 대한 자료구조
💡인덱스 사용시, 고려할 점
- 인덱스의 저장 공간과 생성 시간
- 새로운 데이터를 삽입하거나 기존 데이터를 수정/삭제할 때 인덱스에 대한 작업도 동시에 이루어져야 하기 때문에 인덱스를 유지하고 갱신하는 추가적이 자원과 연산이 필요하다.
- 테이블당 인덱스의 개수가 지나치게 많은 것은 지양한다.
- 중복되는 데이터가 많은 필드에 대해 인덱스를 생성하는 것은 그렇지 않은 필드에 대해 인덱스를 생성하는 것에 비해 인덱스의 성능을 떨어뜨린다.
💡인덱스를 사용할 테이블
- 데이터가 충분히 많은 테이블
- 조회가 빈번히 이루어지는 테이블
📙인덱스의 종류
💡클러스터형 인덱스
- 테이블당 하나씩 만들 수 있는 인덱스
- 테이블 내에 기본키로 지정된 필드는 기본적으로 클러스터형 인덱스로 간주된다.
- 기본 키로 지정된 필드가 없는 경우에는 NOT NULL 제약 조건과 UNIQUE 제약 조건이 있는 필드를 클러스터형 인덱스로 간주한다.
💡세컨더리 인덱스(논클러스터형 인덱스)
- 테이블당 여러 개가 존재할 수 있지만, 클러스터형 인덱스를 활용한 검색보다 일반적으로 느리다.
CREATE INDEX 인덱스_이름 ON 테이블_이름 (필드);
SHOW INDEX FROM 테이블_이름;
DROP INDEX 인덱스_이름 FROM 테이블_이름;
📙인덱스로 사용되는 자료구조
💡해시 테이블
- 키와 값을 저장하는 자료구조
- 해시 함수를 사용해 키를 인덱스로 변환하여 데이터를 저장하고 조회한다.
- O(1)의 시간복잡도로 빠른 데이터 조회가 가능하다.
- 서로 다른 키가 같은 해시값을 가질 수 있기 때문에 충돌 처리가 필요하다.
💡B 트리
- 각 노드에는 키로써 인덱스 값이 포함되어 있고, 인덱스 값을 탐색하면 실제 데이터(레코드)가 저장된 위치를 알 수 있다.
- B 트리의 특성상 다량의 노드에 대한 빠른 검색이 가능하기 때문에 인덱스를 바탕으로 레코드가 저장된 위치를 빠르게 알 수 있다.