Index는 데이터베이스에서 table의 검색 속도를 향상 시켜주는 대표적인 방법중 하나이며,
책의 색인(index)과 같은 역할을 하는 B+Tree 형태의 자료구조입니다.
이점
Full Table Scan
특정 조건을 만족하는 데이터를 찾고자 WHERE절을 사용한다면 Table의 row(record)를 처음부터 끝까지 모두 접근하여 검색조건과 일치하는지 비교하는 과정
- 구조
- index는 특정 column을 search-key 값으로 설정하여 index를 생성하면, 해당 search-key 값을 기준으로 정렬하여 데이터의 물리적 위치를 저장한 pointer와 함께 별도 파일에 저장합니다.
- Index는 순서대로 정렬된 search-key값과 pointer값만 저장하기 때문에 table보다 적은 공간을 차지
대수 확장성 : 트리깊이가 리프 노두 수에 비해 매우 느리게 성장하는 것. 인덱스가 한 깊이씩 증가 할 때마다 최대 인덱스 항목으 수는 4배씩 증가
create index
명령어로 index를 생성하거나 고유키(unique key)로 지정하면 보조 인덱스가 생성== | equal 쿼리가 있다면 제일 먼저 인덱스로 설정
다음으로 정렬에 쓰는 필드를 인덱스로 설정
다중 값을 출력해야하는 필드라면 나중에 인덱스르를 설정
카디널리티가 높은 순서를 기반으로 인덱스 생성
카디널리티(cardinality) : 유니크한 값의 정도
장점
검색 속도 향상 (SELECT~WHERE~ ) index를 생성하면 index에는 데이터들이 정렬되어 저장되어 있기 때문에 검색 조건에 일치하는 데이터들을 빠르게 찾아낼 수 있습니다.
단점
index를 생성하면 저장 공간이 추가적으로 필요합니다. 보통 table의 크기의 10%정도의 공간을 차지합니다.
검색이 아닌 데이터 변경 작업이 자주 발생하면 성능이 나빠질 수 있습니다. 데이터가 변경될 때마다 관련 index를 모두 수정해줘야 되기 때문에 시간이 추가적으로 소요됩니다.
index는 where 절에서 자주 조회되고, 수정 빈도가 낮으며, 데이터 중복이 적고, 선택도가 낮은 column을 선택해서 설정하는 것이 가장 좋습니다.
기준 | 적합성 |
---|---|
카디널리티(Cardinality) | 높을수록 적합 (데이터 중복이 적을수록 적합) |
선택도(Selectivity) | 낮을수록 적합 |
조회 활용도 | 높을수록 적합 (where 절에서 많이 사용되면 적합) |
수정 빈도 | 낮을수록 적합 |
데이터를 검색을 할 때 hash table의 시간복잡도는 O(1)이고 b+tree는 O(logn)으로 더 느린데 왜 index는 hash table이 아니라 b+tree로 구현될까?
Hash table을 사용하면 하나의 데이터를 탐색하는 시간은 O(1)로 b+tree보 다 빠르지만, 값이 정렬되어 있지 않기 때문에 부등호를 사용하는 query에 대해서는 매우 비효율적이게 되어 데이터를 정렬해서 저장하는 b+tree를 이용합니다.