- 테이블의 열 단위에 생성되는 DB의 개체
- 데이터 조회 성능 향상
- 여러 열에 인덱스 생성 가능
- 여러 열을 묶어서 인덱스 생성 가능
- 데이터가 이미 너무 많이 들어있는 상태에서 인덱스를 생성하려고 하면 시간이 오래 걸림
클러스터형 인덱스 (Clustered Index)
- 테이블당 한개만 생성 가능
- PK를 만들었을 때 자동으로 만들어짐
- 데이터를 매번 오름차순으로 정렬
- 데이터가 정렬 후 저장
- 데이터 페이지 = 리프 페이지
- 검색속도 자체는 클러스터형 인덱스가 빠르지만 INSERT의 경우 보조 인덱스가 더 우수
보조 인덱스 (Secondary Index)
- 테이블당 여러 개를 생성 가능
- UNIQUE 제약 조건을 걸었을 때 생성 가능
- FK 제약 조건을 걸었을 때 생성 가능
- CREATE INDEX 구문을 통해서도 생성 가능 (ALTER TABLE로도 가능)
- 데이터 자체의 정렬 X
- 데이터 추가 시 데이터의 부하가 적다
CREATE [UNIQUE] INDEX 인덱스명
ON 테이블명(열 이름)
- 중복되지 않는 열이라면 [UNIQUE] 사용하는 것이 Good
ANALYZE TABLE 테이블명;
- 인덱스를 재구성할 때 사용
- 중복여부에 따라 고유/비고유 인덱스로 나뉜다.
- SELECT 앞에 EXPLAIN 사용하여 실행 계획 확인이 가능하다.
혼합하는 경우
- 보조 인덱스의 리프페이지에 클러스터 인덱스의 Key값을 가지는 것임
- 보조 인덱스의 구조가 변경된다.
- 검색할 때는 손해일 수 있다.
주의 사항
- WHERE절에서 자주 사용되는 열에 인덱스를 만들어야 한다.
- 데이터의 중복도가 높은 열은 인덱스를 만들어도 별 효과가 없다. ex)성별
- JOIN에 자주 사용되는 열에는 인덱스를 생성해 주는 것이 좋다.
- DML 작업이 얼마나 자주 일어나는 경우 인덱스를 넣지 않는 것이 효과적일 수 있다.
- 사용하지 않는 인덱스는 제거, 인덱스도 공간을 차지하기 때문에
인덱스 삭제
- DROP INDEX
- 인덱스를 모두 제거할 때는 보조 인덱스부터 삭제
- 인덱스를 수정하려면 기존 인덱스를 삭제한 후 새로운 인덱스를 생성
DROP INDEX 인덱스 이름 ON 테이블 이름;
ALTER TABLE 테이블 이름 DROP INDEX 인덱스 이름;