데이터베이스 인덱스란 RDBMS에서 대용량 데이터가 있을 때, 특정 데이터를 검색하기 위해서 테이블의 레코드를 full scan하는 것이 아니라, 인덱스가 적용된 컬럼의 테이블(컬럼, 인덱스)를 따로 저장해놓고 그것을 검색해서 검색 효율을 높이는 방법이다.
- Row 값을 순차적으로 scan하여 값을 비교한다.
- 가장 느린 scanning 방법이며, 자원을 많이 사용한다. 즉, 속도도 느리고 자원을 많이 사용하는 좋지않은 방법이다.
- 이러한 문제를 해결하기 위해 DB에서 Index 기능을 제공한다.
읽기 성능을 향상시키기 위한 일종의 자료구조이다. Index는 관련된 Table과 별도로 저장되며, Index로 설정한 컬럼값이 변경되거나 추가되면, Index도 업데이트가 동시에 된다.
- RDBMS에서 사용하는 Index는 Balance Search Tree를 사용한다. (B-Tree 혹은 B+ Tree를 사용)
- 키 값을 기초로 해 테이블에서 검색과 정렬 속도를 향상시킨다.
- 질의나 보고서에서 그룹화 작업의 속도를 향상시킨다.
- 테이블의 기본 키(PK)는 자동으로 인덱스된다.
- 필드 중에서 데이터 형식 때문에 인덱스 될 수 없는 필드도 있다.
- 다중 필드 인덱스를 사용하면, 첫 필드 값이 같은 레코드도 구분할 수 있다.
- 인덱스 된 필드에서 데이터를 업데이트하거나, 레코드를 추가, 삭제할 때 성능이 떨어진다.
- 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요해진다.
- 인덱스를 생성하는데 시간이 많이 소요될 수 있다.
- 데이터 변경이 자주 일어날 경우 인덱스를 재작성해야 할 필요가 있기 때문에 성능에 영향을 끼칠 수 있다.
SELECT 쿼리의 WHERE절이나 JOIN 예약어를 사용했을때만 인덱스가 사용되며 SELECT 쿼리의 검색 속도를 빠르게 하는데 목적이 있다.
- WHERE절에서 사용되는 컬럼을 인덱스로 만든다.
- 데이터의 중복도가 높은 열은 인덱스로 만들어도 효용이 없다.(동일 값이 적은 컬럼 1~15%이하, 5%이하)
- 외래키가 사용되는 열에는 인덱스를 되도록 생성해주는 것이 좋다.
- JOIN에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다.
- INSERT/UPDATE/DELETE가 얼마나 자주 일어나는지 고려해야한다.
- Unique Index : PK나 Unique 제약조건을 정의할 경우에는 Unique Index가 자동으로 생성된다.
- Non UNIQUE INDEX : 중복되는 데이터가 들어가야하는 경우
- Function Based INDEX ( FBI - 함수기반 인덱스 )
- DESCENDING INDEX : 내림차순으로 인덱스를 생성한다. 큰 값을 많이 조회하는 SQL에 생성하는 것이 좋다.
- 계좌 내역 최근 날짜부터 조회, 회사 매출
- 결합인덱스(Composite Index) : 인덱스 생성시 두 개 이상의 컬럼을 합쳐서 인덱스 생성
- 주로 where 조건 컬럼이 2개 이상이 and로 연결되어 사용되는 경우에 많이 사용한다. ( 잘못 생성하게 되는 경우 성능에 나쁜 영향을 미친다. )