데이터베이스에서 검색 속도를 빠르게 하기 위해 사용하는 기능.
데이터의 인덱스를 참조하면 데이터가 저장된 레코드의 주소를 알 수 있다.
DBMS는 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오기엔 시간이 너무 오래 걸리기 때문에 컬럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어둔다.
DBMS의 인덱스는 항상 정렬된 상태를 유지하기 때문에 원하는 값을 탐색하는 데는 빠르나 새로운 값 추가하거나 삭제, 수정하는 경우 실행 속도 느려진다.
=> 데이터의 저장 성능 희생,,, 데이터의 읽기 속도 높인다.
키 값 : 인덱스가 걸린 컬럼의 값.
포인터 : 해당 컬럼이 저장된 레코드의 물리적인 주소.
키 값이 정렬되어 있기 때문에 인덱스를 통해 레코드를 빠르게 접근할 수 있다.
검색 속도가 빨라진다.(데이터가 백만건 정도 될 때)
시스템의 부하를 줄여 성능을 향상시킨다.
DB에 추가적인 저장공간이 필요한다.
인덱스 생성 시간이 오래걸린다.
변경 작업이 자주 일어나면 오히려 성능 저하를 가져올 수 있다.
인덱스를 잘못 사용하면 오히려 성능이 저하될 수 있다.
인덱스를 생성하게 되면 insert, delete, update 쿼리문을 실행할 때 별도의 과정이 추가된다.
insert의 경우 인덱스에 대한 데이터 추가,
delete의 경우 인덱스에 존재하는 값은 삭제하지 않고 사용하지 않는다는 표시만 남는다.(로우의 수가 그대로 남는다.)
=> 실제 데이터가 10만인데 테이블에는 100만개의 데이터가 있을 수 있다.
update는 더 문제다..
인덱스에 대한 데이터를 추가하는 것 뿐만 아니라 변경 전 데이터도 사용하지 않음 처리해야하므로 insert, delete의 문제가 모두 발생.
인덱스는 데이터의 형식에 따라서도 성능이 달라질 수 있다.
데이터의 형식에 따라 인덱스를 만들었을 때 효율적인 데이터가 존재한다.
이름, 나이, 성별 세가지 필드를 가지고 있는 테이블이 있다면 이름에 대해 인덱스를 생성하는 것이 효율적이다.
인덱스 키의 순서에 따라 데이터가 정렬되어 저장됨.
실제 데이터가 순서대로 저장되어 있어 인덱스를 검색하지 않아도 원하는 데이터를 빠르게 찾을 수 있다.
데이터 삽입, 삭제 발생 시 순서를 유지하기 위해 데이터를 재정렬해야함.
한 개의 릴레이션에 하나의 인덱스만 생성할 수 있음.
인덱스의 키 값만 정렬되어 있을 뿐 실제 데이터는 정렬되지 않음.
데이터를 검색하기 위해서 먼저 인덱스를 검색하여 실제 데이터의 위치를 확인해야하므로 클러스터드 인덱스에 비해 검색 속도가 떨어진다.
한 개의 릴레이션에 여러 개의 인덱스 만들 수 있다.
인덱스를 저장하는 블록들이 트리 구조를 이루고 있음.
상용 DBMS에서는 트리 구조 기반의 B+트리 인덱스를 주로 활용
컬럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘.
매우 빠른 검색 지원한다.
그러나 값을 변형해서 인덱싱하기 때문에 특정 문자로 시작하는 값으로 검색을 하는 등 값의 일부만으로 검색할때는 해시 인덱스를 사용할 수 없다.
해시 함수는 등호(=)연산에만 특화되어있으므로 부등호 연산(<,>)이 자주 사용되는 데이터베이스 검색을 위해서는 적합하지 않다.
인덱스 컬럼의 데이터를 비트값인 0 또는 1로 변환하여 인덱스 키로 사용하는 방법.
컬럼의 값 대신 컬럼에 특정 함수나 수식을 적용하여 산출된 값을 사용.
B+트리 인덱스 또는 비트맵 인덱스를 생성하여 사용.
다수의 조인된 객체로 구성된 인덱스. 비트맵 인덱스와 물리적 구조가 동일
개발자가 필요한 인덱스를 직접 만들어 사용.
인덱스의 대상 테이블이나 컬럼 등 산정 -> 인덱스 효율성 검토하여 인덱스 최적화 수행 -> 인덱스 정의서 작성
select index_name, table_name, column_name
from user_ind_columns
where table_name='[테이블이름]'
오라클에서는 pk가 자동으로 인덱스로 세팅이 된다.
create index 인덱스이름
on 테이블이름(컬럼명)