인덱스는 데이터 레코드를 빠르게 접근하기 위해 <키 값, 포인터> 쌍으로 구성되는 데이터 구조이다.
데이터 빠르게 찾을 수 있는 수단이며 이블에 대한 조회 속도 높여 주는 자료구조
테이블에서 자주 사용되는 컬럼 값 빠르게 검색 가능토록 색인 만들어 놓은 형태
인덱스가 없으면 특정한 값을 찾기 위해 모든 데이터 페이지를 확인하는 이 발생한다.
레코드의 삽입과 삭제가 수시로 일어나는 경우에는 인덱스의 개수를 최소로 하는 것이 효율적
과다한 인덱스 생성은 DB 공간 많이 차지하며 Full Table Scan보다 속도가 느려질 수 있음
테이블 데이터 삽입, 삭제, 변경 수행하는 DML 작업 시 성능 떨어짐
레코드의 물리적 순서가 인덱스의 엔트리 순서와 일치하게 유지되도록 구성되는 인덱스를 클러스터드 인덱스라고 한다.
클러스터드 인덱스(Clustered index)
- 인덱스 키의 순서에 따라 데이터가 정렬되어 저장되는 방식
- 한 개의 릴레이션에 하나의 인덱스만 생성할 수 있음
넌클러스터드 인덱스(Non-Clustered index)
- 인덱스의 키 값만 정렬되어 있을 뿐 실제 데이터는 정렬되지 않는 방식
- 한 개의 릴레이션에 여러 개의 인덱스를 만들 수 있음
인덱스를 저장하는 블록들이 트리 구조를 이루는 것으로 상용 DBMS에서는 트리 구조 기반의 B+ 트리 인덱스를 주요 사용한다.
트리 인덱스
B+ 트리 인덱스
컬럼의 데이터를 Bit 값인 0 또는 1로 변환하여 인덱스 키로 사용하는 방법
목적은 키 값을 포함하는 로우(Row)의 주소를 제공하는 것
분포도가 좋은 컬럼에 적합, 성능 향상
효율적인 논리 연산 가능, 저장공간 작음, 압축 효율 좋음.
컬럼의 값 대신 컬럼에 특정함수나 수식을 적용하여 산출된 값을 사용하는 것
함수 기반 인덱스는 데이터를 입력하거나 수정할 때 함수를 적용해야 하므로 부하가 발생
함수 기반 인덱스는 대소문자, 띄어쓰기 등에 상관없이 조회할 때 유용하게 사용
적용 가능한 함수의 종류: 산술식, 사용자 정의 함수, PL, Function, Packange, C callout 등
다수의 조인된 객체로 구성된 인덱스
개발자가 필요한 인덱스를 직접 만들어서 사용, 확장형 인덱스
인덱스 컬럼의 분포도가 10~15프로 이내인 컬럼
분포도가 10~15프로 이상이어도 부분 처리를 목적으로 하는 컬럼
입/출력 장표 등에서 조회 및 출력 조건으로 사용되는 컬럼
인덱스가 자동 생성되는 기본키와 유니크키 제약 조건을 사용하는 컬럼
수정이 발생하지 않는 컬럼
ORDER BY, GROUP BY, UNION 이 자주 발생하는 컬럼
인덱스가 자주 조합되어 조회하는 경우 결합 인덱스로 생성
새로 추가되는 인덱스는 기존 액세스 경로에 영향을 미칠 수 있다.
인덱스를 지나치게 많이 만들면 오버헤드가 발생한다.
인덱스를 만들면 추가 저장 공간이 필요하다.
인덱스와 테이블 데이터의 저장 공간이 분리되도록 설계한다.