인덱스란?
인덱스는 테이블의 동작 속도를 높여주는 자료 구조입니다.
마치 책 뒷 편의 색인처럼 원하는 정보를 빠르게 찾아주는 도구입니다.

인덱스는 DB의 메모리에 일정 공간을 사용해서 저장됩니다.
그렇기 때문에 이 소모되는 메모리를 효율적으로 사용할 수 있도록 잘 사용되어야 합니다.
인덱스 특징
인덱스를 설정하는 기준은?
인덱스를 많이 설정한다고 해서 검색 속도가 더 향상되지는 않습니다.
오히려 데이터베이스 메모리를 사용해서 테이블 형태로 저장 되기 때문에 비효율적입니다.
따라서 인덱스를 설정할 때는
- 조회 시, 자주 사용 되고
- 고유한 값 위주로
설정 하는 것이 좋습니다.
참고로 인덱스 손익분기점이 있는데, 테이블이 가지고 잇는 전체 데이터양의 10-15% 이내의
데이터가 출력 될때만 인덱스를 타는것이 효율적입니다.
(그 이상인 경우에는 풀스캔이 오히려 더 빠릅니다.)
DML(Data Manipulation Language) 각각에는 어떤 영향을 미칠까?
인덱스를 설정하게 되면 INSERT, DELETE, UPDATE 작업을 할때 추가 비용을 감당을 해야 합니다.
이를 감수하고 인덱스를 구축하는 이유는 바로 빠른 검색(SELECT)를 위해서 입니다.
인덱스가 없는 컬럼 조건으로 UPDATE, DELETE를 하게 되면 굉장히 느리기 때문에
많은 양의 데이터를 삭제해야 한다면 인덱스로 지정된 컬럼으로 진행하는것이 좋습니다.
Cardinality(기수성)가 높을 수록 인덱스 설정하기에 좋습니다.
모든 인덱스 키 값 가운데 유니크한 값의 수를 의미합니다.
- 카디널리티가 높은 경우
- 주민등록번호
- 사업자 등록번호
- 카디널리티가 낮은 경우
- 성별
- 이름
실제로 찾고자 하는 데이터가 단 한건이라면 이를 찾기 위해 중복되는 다른 불필요한 데이터 또한 검색되기 때문에
인덱스는 최대한 중복이 최대한 적도록 카디널리티가 높은 컬럼을 선택해야 합니다.
인덱스의 종류
B-Tree 인덱스
인덱싱 알고리즘 가운데 가장 일반적으로 사용되고, 가장 먼저 도입된 알고리즘 입니다.
지금까지도 가장 범용적인 목적으로 사용되고 있는 인덱스 알고리즘 입니다.
B-Tree의 B가 바이너리(이진) 트리라고 잘못 생각할 수 있겠지만,
B는 Balanced를 의미한다는 점을 주의해야 합니다.
B-Tree는 컬럼의 원래 값을 변형 시키지 않고 (물론 값의 앞부분만 잘라서 관리 함),
인덱스 구조체 내에서는 항상 정렬된 상태로 유지합니다.
구조 및 특성
- Root node
- 최상위에 있는 하나의 루트 노드
- Leaf node
- 루트의 하위 자식 노드
- 실제 데이터 레코드를 찾아가기 위한 주소 값
- Branch node
- 루트도 리프도 아닌 중간의 노드
Hash 인덱스
컬럼의 값으로 해시값을 계산해서 인덱싱하는 알고리즘으로, 매우 빠른 검색을 지원합니다.
하지만 값을 변형해서 인덱싱하기 때문에
Prefix 일치와 같은 값의 일부만 검색하거나 범위를 검색할 때는 해시 인덱스를 사용할 수 없습니다.
(오로지 동등 연산자만 지원)
Hash 인덱스는 주로 메모리 기반의 데이터베이스에서 많이 사용합니다.
인덱스 주의사항
- 인덱스 컬럼을 가공
- 인덱스 컬럼의 묵시적 형변환
- 숫자가 우선 순위에 있다.
- 비교하는 값이 문자라면 값이 숫자여도 문자로 변환
- 묵시적 형변환으로 인해 함수 기반의 인덱스 생성하는 경우도 있음
- 인덱스 컬럼 부정형 비교
- Like 연산자 사용 시 %가 앞에 위치
- OR 조건 사용 → UNION ALL로 대체