인덱스란?
- DB에서 보다 더 빠른 조회를 하기 위해서 특정 컬럼에 대해서 물리적인 주소를 저장해 놓는 것
- 인덱스는 주로 WHERE절의 최적화를 위해 설계되는 것이 주류이다.
- 과도한 인덱스 생성은 오히려 성능을 떨어뜨리는 효과를 초래한다.
- 인덱스 또한 DB의 테이블 객체이기 때문에 저장공간을 차지한다. 그래서 과도한 인덱스는 불필요한 공간을 차지한다.
- 테이블에 쓰기 작업을 하게될 경우 인덱스 또한 동기화 시켜줘야하기 때문에
- 인덱스는 독립적으로 존재할 수 없다. -> 다른 테이블에 의존적이다.
다중 컬럼 인덱스
- 여러개의 칼럼으로 인덱스를 만드는 것을 뜻한다. (MySQL의 경우 최대 15개까지의 컬럼을 지정할 수 있다.)
- INSERT,DELETE,UPDATE 시 많은 자원을 필요로 하기에 신중히 고려하여 결정해야 한다. -> 수정이 적은 것을 대상으로 설정해야한다.
- 쿼리가 여러 칼럼을 조합하여 자주 필터링하거나 정렬할 때 여러 개의 단일 칼럼 인덱스 보다 다중 칼럼 인덱스를 고려해 보는 것이 좋다.
인덱스의 동작 방식
인덱스의 동작 방식을 알기 전에 먼저 클러스터링 인덱스(Clustering Index)와 세컨더리 인덱스(Secondary Index, Non Clustering Index) 를 알아볼 필요가 있다.
클러스터링 인덱스 ( Clustering Index )
- PK(또는 히든 키, 유니크 키)와 실제 물리적 주소가 저장된 인덱스이다.
- 각 테이블 마다 하나씩만 존재한다.
- 실제 물리적 순서와 PK의 순서대로 저장되어 있어 순차 IO의 경우 사용되기도 한다.
- 데이터가 삽입, 삭제 시에 물리적 순서가 변경되기 때문에 논리적 순서가 적힌 테이블은 이를 항상 동기화 시켜줘야한다. 클러스터링 인덱스가 동기화 되면 클러스터링 인덱스의 위치를 가리키는 논 클러스터링 인덱스 또한 이를 동기화해야하기 때문에 과한 인덱스 사용을 지양하는 이유가 바로 이것이다.
세컨더리 인덱스 ( Secondary Index, Non Clustering Index)
- 우리가 직접 설정하는 인덱스들을 세컨더리 인덱스라고 한다.
- 보통 한 테이블당 3~5개의 인덱스를 사용한다.