05. 인덱스(Index)

05. 인덱스(Index)

인덱스(Index) #

테이블의 검색 성능(속도)를 향상시켜주기 위해 사용되는 기술(혹은 자료 구조)입니다.

데이터들을 정렬된 상태로 관리하여, 검색 시 이점이 있습니다.

  • Order by 효율성 : 이미 정렬되어 있기에 인덱스에서 관리된 형태 그대로 가져올 수 있다.
  • Min, Max 효율성 : 첫 번째 값, 마지막 값을 가져와 사용할 수 있다.
  • Where 효율성 : 테이블의 데이터들은 내부적으로는 정렬되지 않은 상태로 저장되기 때문에 인덱스 없는 검색 시 Full-Scan이 필요하다. 인덱스 사용 시에는 정렬된 형태로 값을 저장하기 때문에 빠르게 데이터를 검색할 수 있다.
  • 페이지 : InnoDB에서는 디스크에 데이터를 저장하는 가장 기본 단위를 ‘페이지‘라고 한다.
    • 인덱스도 ‘페이지’ 단위로 관리된다.
    • 페이지는 16KB로 크기가 고정되어 있다.
    • 인덱스의 키의 크기가 크면, 페이지를 많이 생성하게 되어(많은 페이지를 읽게 되어) 성능 이슈가 발생한다.
  • 인덱스는 카디널리티(Cardinality)가 높은 것을 선택한다.

복합 인덱스의 경우 #

  • 복합인덱스 구성 시, 카디널리티가 높은 순에서 낮은 순으로 구성한다.

    • e.g. idx(주민번호, 성별) vs (성별, 주민번호)
    • 카디널리티가 높은 순으로 하면, btree 탐색 과정이 효율적일 것 같다.
    • 직접 테스트를 통해 비교하는 것은 필요하다.
  • 복합인덱스 구성 시, 조건 절에 가장 맨 앞의 컬럼은 포함되어야 한다.

    • 중간이나 뒤에 컬럼은 빠져도 된다. (물론, 정확한 확인 필요하다.)
  • 복합인덱스 구성 시, 범위 조건(between, like, >, <) 이후 컬럼은 인덱스로 사용되지 않는다.

    • =, in은 이후 컬럼도 인덱스로 사용된다. (in 은 = 를 여러번 실행 시킨 것)
    • 단, in 의 인자값으로 서브쿼리가 들어가면 이것은 인덱스로 활용되지 않는다. 체크조건으로 실행된다. (서브 쿼리의 외부가 먼저 실행, 이후 체크조건으로 in 절 실행)

인덱스(Index) 자료구조 #

해시 테이블 #

  • 해시테이블은 등호(=)연산에만 특화되어있다. 부등호 연산에는 적합하지 않다.

RedBlack-Tree #

  • 밸런스를 유지하는 트리이다.
  • 하나의 노드에 하나의 값만을 갖는다. (DB 인덱스 자료구조로 적절하지 않다.)
    값을 탐색할 때,
    1.하나의 노드에 배열의 형태로 여러 값이 있는 것(b-tree)과
    2.노드 마다 주소를 찾아가야하는 것(redblack-tree)의 차이이다.

배열 #

  • 배열로 관리한다면 탐색 시에는 이점이 있다. (선형 탐색)
  • 값 추가, 수정, 삭제 등의 경우 배열의 순서를 다시 유지해주어야 하는 비용이 크다. (DB 인덱스 자료구조로 적절하지 않다.)

B-Tree #

  • 트리의 균형을 맞춘다.
  • 중간 노드를 포함한 모든 노드에서 Key, Data를 담을 수 있다.
  • 2개보다 더 많은 자식 노드를 가질 수 있다.(Binary Tree 를 확장한 구조이다.)
    하나의 노드에 N개의 자료를 가지고 있다면, N차 B-Tree라고 부른다.
  • 각 노드 = Disk Block 과 같다.
  • Full-Scan 시 모든 노드를 방문한다.

B+Tree #

  • 리프 노드에만 Key, Data를 담는다.
  • Key가 중복될 수 있다. (리프 노드에만 Data가 있기 때문에)
  • 리프노드끼리는 (양방향, Double)연결리스트로 연결되어 있다.
    부등호 검색과 같은 것이나 순차적으로 순회할 필요가 있을 때 이점이 있다.
  • 중간 노드에는 Key 만을 갖는다. 따라서, 더 많은 값들을 수용할 수 있다. (= 더 적은 수의 노드를 사용한다 = 더 적은 용량을 차지한다 = B-Tree에 비해 상대적으로 더 적은 Disk Block을 읽어도 된다.)
  • Full-Scan 시 리프 노드 레벨에서 선형 시간으로 탐색할 수 있다.

참고 #