개요
- 인덱스란 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조로 키 값으로 행 데이터의 위치를 식별하여 사용한다.
- 테이블의 컬럼을 색인화하여 별도 파일로 저장하기 때문에 해당 테이블의 레코드를 Full scan 하지 않는다.
//인덱스 생성
CREATE INDEX 인덱스명 ON 테이블명 (컬럼명);
ALTER TABLE 테이블명 ADD INDEX 인덱스명 (컬럼명);
//인덱스 삭제(수정은 DROP 후 재생성)
ALTER TABLE 테이블명 DROP INDEX 인덱스명;
인덱스의 관리
- DBMS는 인덱스를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.
- 이 때문에 인덱스가 적용된 컬럼에 INSERT,UPDATE,DELETE가 수행된다면 아래와 같은 연산을 추가적으로 해주어야 한다. (오버헤드 발생)
- INSERT : 새로운 데이터에 대한 인덱스를 추가
- UPDATE : 기존의 인덱스를 사용하지 않음 처리하고 갱신된 데이터에 대해 인덱스를 추가
- DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업 처리
인덱스의 장단점
장점
- 테이블을 조회하는 속도를 향상시킬 수 있다.
- 전반적인 시스템의 부하를 줄일 수 있다.
단점
- 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장 공간이 필요하다.
- 인덱스를 관리하기 위한 추가 작업이 필요하다.
- 인덱스를 잘못 사용할 경우 오히려 성능이 저하될 수 있다.
인덱스를 사용하면 좋은 경우
- 데이터의 중복도가 낮은 컬럼
- INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
- JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
함께 고려해보면 좋은 것
- 인덱스 키의 크기는 되도록 작게 설계되어야 성능에 유리하다.
- 분포도가 좁은 범위,PK,JOIN과 연결 고리과 되는 컬럼을 인덱스로 구성한다.
- 단일 인덱스 여러 개보다 다중 컬럼 인덱스를 구성하는게 좋다.
- 인덱스 생성 시 가장 효율적인 자료형은 정수형 타입이다. 가변적인 크기와 정규화 할 수 없는 데이터는 인덱스 생성 시 비효율적으로 동작한다.
인덱스를 구현한 자료구조
해시 테이블
B+TREE