[Database] 인덱스(Index)

bin·2025년 1월 22일
0

인덱스(Index)란?

인덱스란 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다.
목차를 이용해 빠르게 책에서 원하는 내용을 찾을 수 있듯이, 인덱스를 활용하면 원하는 데이터를 빠른 속도로 조회할 수 있다.
인덱스를 활용하면 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상된다. UPDATE나 DELETE도 먼저 데이터를 조회한 후 처리하기 때문이다.

인덱스 사용 이유


위 예시에서 LCY 값을 조회한다고 가정하면,
인덱스를 쓰지 않을 경우 Full Scan 방식으로 모든 데이터를 조회한 후 최종적으로 LCY가 포함된 모든 값들을 반환한다. 이러한 로직을 사용한다면 데이터 양이 많을수록 굉장히 비효율적일 것이다.
그러나 인덱스를 사용한다면 자주 조회되는 컬럼에 대한 인덱스 테이블을 따로 만들어 인덱스 테이블에 있는 값들로 결과 값을 조회할 수 있어 처리 속도를 올릴 수 있다.

인덱스의 동작순서

인덱스 테이블에서 Where 절에 포함된 값을 찾음
-> 해당 값의 PK를 가져옴
-> 가져온 PK 값으로 원본 테이블에서 값을 조회해옴

인덱스의 관리

DBMS는 인덱스를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다. 그렇기 때문에 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 각각 다음과 같은 연산을 추가적으로 해주어야 하며 그에 따른 오버헤드가 발생한다.

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

인덱스의 장점과 단점 

장점

  • 데이터가 정렬되어 있기 때문에 검색과 정렬 속도를 향상시킨다.
    - WHERE 절: 인덱스로 데이터가 정렬되어 있으면 Full Scan 방식보다 훨씬 빠르게 찾을 수 있다.
    - ORDER BY 절: Full Scan 방식이 아닌 인덱스로 데이터를 미리 정렬해두어 Order by절에 의한 부하가 적다.
    - MIN, MAX의 효율적인 처리: Full Scan 방식이 아닌 인덱스로 데이터를 미리 정렬해두어 MIN, MAX를 효율적으로 처리할 수 있다.
  • 전반적인 시스템의 부하를 줄일 수 있다.

단점

  • DB 내 인덱스 관리용 저장공간이 별도로 필요하다.
    : 너무 많은 인덱스는 데이터베이스 성능 부하를 가져올 수 있다. 이러한 이유로 인덱스 생성보다 SQL문을 효율적으로 작성하는 것이 우선이다. 그럼에도 성능이 저하된다면 인덱스를 고려해봐야 한다.
  • 인덱스를 잘못 사용할 경우 오히려 성능이 저하될 수 있다.
    : 극단적으로 예시를 들면 100만개의 데이터를 가진 테이블에서는 인덱스를 사용하는 것이 효과적일 수 있으나 100개의 데이터를 가진 테이블은 인덱스 생성으로 인한 성능 부하가 더 클 수 있으므로 Full Scan 방식이 나을 수 있다.  

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

  • 규모가 작지 않은 테이블
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
  • 데이터의 중복도가 낮은 컬럼 (=유니크한 값을 가져오는 경우)
    - 근거: 인덱스는 내부적으로 Key,Value의 트리 형태로 데이터를 저장하는데, 데이터(Key)가 중복되어 여러개 존재하면 검색되는 대상이 증가하기 때문

0개의 댓글