인덱스란?

인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 테이블의 모든 데이터를 검색하면 시간이 매우 오래 걸리기 때문에, 데이터와 데이터의 위치를 포함하는 자료구조인 인덱스를 생성하여 데이터를 빠르게 조회할 수 있도록 한다.

1. 인덱스의 장점

인덱스의 가장 큰 특징은 데이터가 정렬되어 있다는 것이다.

조건 검색 WHERE 절의 효율성
테이블을 만들고 데이터가 쌓이게 되면 인덱스를 사용하지 않는 경우, 테이블의 레코드들은 순서가 없이 저장된다. 이러한 경우 WHERE 절의 조건에 맞는 데이터들을 찾아낼 때, 레코드를 처음부터 끝까지 다 읽어서 검색 조건과 맞는지 비교해야 한다. 하지만 인덱스를 사용하는 테이블의 경우, 데이터들이 정렬되어 있기 때문에 조건에 맞는 데이터들을 빠르게 찾아낼 수 있다.

정렬 ORDER BY 절의 효율성
인덱스를 이용하면 이미 정렬이 되어 있기 때문에 ORDER BY에 의한 정렬 과정을 피할 수 있다. ORDER BY는 굉장이 오버헤드가 큰 작업이다. 1차적으로 메모리에서 정렬이 이루어지고, 메모리 공간보다 큰 공간이 필요하다면 디스크 I/O도 추가적으로 발생하기 때문이다.

MIN, MAX 함수 적용의 효율성
MIN 값과 MAX 값을 얻고 싶을 때, 레코드의 시작 값과 끝 값을 참조하면 되기 때문에 Full Table Scan으로 테이블을 모두 뒤져서 작업하는 것 보다 훨씬 효율적이다.

2. 인덱스의 단점

인덱스의 가장 큰 문제점은 정렬된 상태를 계속해서 유지시켜야 한다는 것이다.

인덱스는 DML(Data Manipulation Language)에 취약하다
INSERT, DELETE, UPDATE를 통해 데이터가 추가/삭제되거나 값이 바뀌게 된다면 인덱스 테이블 내에 있는 값들을 다시 정렬해야 한다. 또한 원본 테이블 뿐만 아니라 인덱스 테이블도 수정해 주어야 하므로 추가적인 오버헤드가 발생한다. 따라서 DML이 빈번한 테이블보다 SEARCH를 위주로 하는 테이블에 인덱스를 생성하는 것이 좋다.

  • INSERT: 인덱스의 block들이 하나에서 두 개로 나누어지는 index split 현상이 발생할 수 있다. 새로운 block을 할당 받고 key를 옮기는 작업을 수행하는데, 그 동안 해당 블록에 대한 key 값이 변경되면 안되므로 DML이 블로킹 된다.
  • DELETE: 데이터가 지워지지 않고 사용 안 됨 표시만 한다. 따라서 테이블 데이터의 개수와 인덱스의 개수가 같지 않을 수 있다.
  • UPDATE: DELETE가 먼저 발생한 후 INSERT가 실행되므로, 다른 DML보다 더 큰 부하를 준다,

인덱스 스캔이 항상 효율적인 것은 아니다
검색을 위주로 하는 테이블에 인덱스를 생성하는 것이 좋지만, 그러한 경우에도 무조건 인덱스를 설정하는 것이 좋은 것은 아니다. 인덱스는 테이블의 전체 데이터 중 10% ~ 15% 이하의 데이터를 처리하는 경우에만 효율적이고 그 이외의 경우에는 인덱스를 사용하지 않는 것이 더 낫다.

인덱스를 너무 많이 만드는 것은 좋지 않다
인덱스를 관리하기 위해서는 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요하다. 속도 향상과 인덱스를 생성했을 때 드는 비용을 비교하여, 인덱스를 만들지 말지 결정하는 것이 필요하다.

3. 인덱스를 이용한 자료구조

[ 해시 테이블(Hash Table) ]
해시 테이블은 (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠른 데이터 검색이 필요할 때 유용하다. Key 값을 이용하여 고유한 index를 생성하고 그 index에 저장된 값을 꺼내오는 구조이다.


해시 테이블이 빠른 검색속도를 제공하는 이유는 내부적으로 버킷을 사용하여 데이터를 저장하기 때문이다. 각각의 Key 값에 해시함수를 적용해 배열의 고유한 index를 생성하고, 이 index를 이용해 값을 저장하거나 검색하게 된다. 하지만 해시 테이블이 사용되는 경우는 제한적인데, 그러한 이유는 해시가 등호 연산에만 특화되었기 때문이다. 해시 함수는 Key 값이 조금이라도 달라지면 완전히 다른 해시 값을 생성하는데, 이러한 특성에 의해 부등호 연산이 자주 사용되는 데이터베이스 검색을 위해서는 해시 테이블이 적합하지 않다.

댓글남기기