- 데이터 베이스 테이블에 대한 검색 성능을 향상시키는 자료 구조이며 WHERE 절 등을 통해 활용된다.
- 데이터가 특정 기준으로 정렬되어 있다면 검색을 빠르게 할 수 있다.
- 인덱스는 항상 최신의 정렬 상태를 유지
- 인덱스도 하나의 데이터베이스 객체
- 데이터베이스 크기의 약 10% 정도의 저장 공간 필요
- 특징
- 순차적으로 접근
- 접근 비용 감소
- 사용
- 적용 가능한 인덱스가 없는 경우
- 인덱스 처리 범위가 넓은 경우
- 크기가 작은 테이블에 엑세스하는 경우
- 트리 높이가 같음
- 자식 노드를 2개 이상 가질 수 있음
- 기본 데이터베이스 인덱스 구조
- 하나 더 추가하는 경우
- 페이지에 새로운 데이터를 추가할 여유공간이 없어 페이지에 변화가 발생
- DB가 느려지고 성능에 영향을 준다.
인덱스의 데이터를 실제로 지우지 않고 사용안함 표시를 한다.
- 클러스터링 인덱스
- 논-클로스터링 인덱스(보조 인덱스, 세컨더리 인덱스)
: 무리, 군집
- 실제 데이터 자체가 정렬
- 테이블당 1개만 존재 가능
- 리프 페이지가 데이터 페이지
- 아래의 제약조건 시 자동 생성
- primary key (우선순위)
- unique + not null
- 실제 데이터 페이지는 그대로
- 별도의 인덱스 페이지 생성 → 추가 공간 필요
- 테이블당 여러 개 존재
- 리프 페이지에 실제 데이터 페이지 주소를 담고 잇음
- unique 제약 조건 적용시 자동 생성
- 직접 index 생성 시 논-클러스터링 인덱스 생성
: 클러스터링 + 논-클러스터링 인덱스
: 그룹 내 요소의 개수
: 카디널리티(그룹 내 요소의 개수)가 높은 것 == 중복 수치가 낮은 것
: id, 이메일
- 카디널리티가 높은 (중복도가 낮은) 컬럼
- WHERE, JOIN, ORDER BY 절에 자주 사용되는 컬럼
- 인덱스는 추가 공간이 필요로 된다.
- 조건 절이 없다면 인덱스가 사용되지 않는다.
- INSERT / UPDATE / DELETE 가 자주 발생하지 않는 컬럼
- 규모가 작지 않은 테이블
- Non_unique
- 중복 값이 허용되지 않으면 0
- 중복 값이 허용되면 1
- Key_name
- 인덱스의 이름, 기본 키라면 PRIMARY 표시
1. 잘 활용되지 않는 인덱스는 과감히 제거하자
- WHERE 절에 사용되더라도 자주 사용해야 가치가 있다. - 불필요한 인덱스로 성능저하가 발생할 수 있다.
2. 데이터 중복도가 높은 컬럼은 인덱스 효과가 적다
3. 자주 사용되더라도 INSERT / UPDATE / DELETE 가 자주 일어나는지 고려해야 한다.
- 일반적인 웹 서비스와 같은 온라인 트랜잭션 화경에서 쓰기와 읽기의 비율은 2:8 또는 1:9이다. - 조금 느린 쓰기를 감수하고 빠른 읽기를 선택하는 것도 하나의 방법이다.
- B+Tree
- 다중 컬럼 인덱스
- ANALYZE TABLE
- 실행계획
- SQL 최적화
- 옵티마이저