인덱스(Index)

uni.gy·2023년 5월 16일
0

CS

목록 보기
11/18

인덱스

데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 책의 색인과 같다. 특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 데이터를 오름차순으로 정렬하기 때문에 정렬된 주소체계라고 표현할 수 있다.

인덱스의 관리

DBMS는 인덱스를 항상 최신의 정렬된 상태로 유지해야 한다. 그렇기 때문에 인덱스가 적용된 컬럼에 추가적인 연산이 필요하며, 그에 따른 오버헤드가 발생한다.

  • INSERT : 새로운 데이터에 대한 인덱스를 추가함
  • DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함
  • UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함

장단점

장점

  • 테이블을 조회하는 속도와 시스템의 부하를 줄일 수 있다.
  1. WHERE절 효율성 향상
    테이블에 데이터가 쌓이면 레코드(row)는 순서가 없이 저장이 된다. 이렇게 되면 WHERE절에 맞는 데이터를 찾아 낼 때 Full table scan을 해야한다. 하지만 index table scan 시 데이터들이 정렬되어 있기 때문에 빠르게 찾아낼 수 있다.
  2. 불필요한 ORDER BY절 대체
    ORDER BY는 부하가 많이 걸리는 작업이다. 인덱스를 사용하면 정렬이 되어 있기 때문에 불필요한 ORDER BY절을 사용하지 않아도 된다.
  3. MIN, MAX의 효율적인 처리
    인덱스 테이블에서 첫번째 값과 마지막 값만 가져오면 되기 때문에 full table scan보다 효율적이다.

단점

  1. INSERT, UPDATE, DELETE 작업에 추가적인 작업이 발생하므로 오버헤드가 발생한다.
  2. 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
  3. 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.
    1개의 데이터가 있는 테이블처럼 데이터가 적을 경우 풀 스캔이 빠르다.

인덱스를 사용하면 좋은 경우

  • 규모가 작지 않은 테이블
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN이나 WHERE ORDER BY에 자주 사용되는 컬럼
  • 데이터의 중복도가 낮은 컬럼

인덱스의 자료구조

해시 테이블

  • 빠른 검색이 가능하다.
  • Equal(=) 연산에 좋은 성능을 보이지만 정렬되어 있지 않아 부등호 연산에는 적합하지 않다.
  • 범위 검색에는 적합하지 않다.

b-tree

하나의 노드에 많은 정보를 가지거나, 두 개 이상의 자식을 가질 수 있는 tree.
최대 M개의 자식을 가질 수 있는 M차 b-tree라고 한다.

b-tree 생성 과정 볼 수 있는 사이트

b+tree

b-tree를 개선시킨 자료구조이다.

  • 리프노드만 인덱스와 실제 데이터를 가지고 있고, 나머지 노드들은 인덱스만을 갖는다(포인터 역할).
  • 리프노드들은 링크드리스트로 연결되어 있다.

b-tree b+tree 이해하기 쉬운 동영상

profile
한결같이

0개의 댓글