[Database] 데이터베이스 index(인덱스) 알아보기

2024. 3. 2. 23:57백엔드/Database

데이터베이스를 설계/운영할 때 데이터 조회 속도를 향상하기 위해 인덱싱을 사용하는데요! 

이번 게시글에서는 데이터베이스의 인덱스란 무엇인지 또 이것의 장/단점은 무엇인지 알아보려고 합니다🔥

 

# 인덱스

  • 데이터베이스에서 특정 컬럼에 대한 검색 성능을 향상하는 데 사용되는 데이터 구조
  • 데이터베이스가 레코드를 검색할 때 전체 테이블을 스캔하는 대신 인덱스를 사용하여 더 빠른 검색이 가능 

 

# 인덱싱

  • 인덱싱은 인덱스를 생성하고 유지하는 프로세스
  • 주로 검색 및 정렬 작업을 최적화하기 위해 사용

 

# 인덱싱의 장점과 단점

👍 장점

  1. 검색 속도 향상
    : 데이터를 검색/조회하는 데 걸리는 시간이 줄어들어 효과적인 데이터 검색 작업 수행
  2. 정렬 속도 향상
    : 데이터가 이미 정렬된 상태이기 때문에 이미 정렬된 상태의 데이터를 활용하여 효과적인 정렬 작업 수행
  3. 조인 성능 향상
    : 인덱스된 열을 기준으로 조인을 수행할 때, 두 테이블 간의 매칭되는 행을 빠르게 찾아내어 조인 작업 수행 

👎 단점

  1. 저장 공간 소비
    • 추가적인 저장 공간이 필요하므로 데이터베이스의 크기가 증가
    • 데이터를 Delete 하는 경우에도 데이터가 실제로 삭제되지 않고 사용하지 않는 데이터로 처리되기 때문에 인덱스 테이블의 크기가 기존 테이블의 크기보다 커지는 경우도 발생할 수 있음
  2. 갱신 비용
    • 데이터의 삽입, 수정, 삭제 작업이 발생할 때마다 인덱스도 함께 갱신해야 하므로 데이터 변경 작업의 속도 저하 
    • 인덱스가 수정이 되면 인덱스의 자료구조인 B-Tree의 높이를 균형있게 조절하고 데이터를 효율적으로 조회할 수 있도록 분산시키는 추가 비용 발생 
  3. 관리 비용 
    • 인덱스를 유지보수하고 최적화하는 추가적인 관리 비용이 발생

 

# 인덱스의 종류 

간단하게 클러스터형과 세컨더리 인덱스에 대하여 알아보자

1. Clustered Index (클러스터형 인덱스)

  • 데이터를 물리적으로 정렬하는 인덱스 (MySQL에서는 InnoDB 스토리지 엔진에서만 지원)
  • 테이블당 하나의 클러스터형 인덱스 생성 가능 
  • 보통 테이블의 기본 키(primary key)에 생성되며, 기본 키가 정의되지 않은 경우 유니크한 열(unique key)에 대해 인덱스 생성 가능

2. Secondary Index (보조 인덱스)

  • create index를 사용하여 세컨터리 인덱스 생성 가능
  • 테이블의 데이터를 물리적으로 재정렬하지 않고, 별도로 정의된 인덱스를 통해 데이터에 대한 참조를 제공
  • 테이블의 물리적인 순서와 인덱스의 순서가 다를 수 있음 
  • 테이블당 여러 개의 보조 인덱스 생성 가능 

 

# 인덱스를 생성하는 방법

# 방법은 아주 간단하다. 아래 명령어를 실행해주면 끝.
CREATE INDEX 인덱스명 ON 테이블이름 (열1, 열2);  -- 복합 인덱스 생성

 

 

 

 


 

 

 

🤔 인덱스는 B-Tree의 자료구조로 이루어져 있습니다. 그렇다면 B-Tree에 대해서도 알아볼까요?!

 

# B-Tree

  • B-트리(B-Tree)는 이진 트리(Binary Tree)에서 발전한 자료 구조로, 모든 리프 노드(자식이 없는 노드)가 같은 레벨을 유지하여 자동으로 밸런스를 맞추는 트리
  • 대용량 데이터를 효율적으로 저장하고 검색하는 데 사용
  • 데이터가 정렬된 순서를 보장하므로 범위 검색에 유용

 

B-Tree에 대해서는 아래 Youtube 영상을 참고해 주시면 조금 더 쉽게 이해하실 수 있을 것 같습니다! 

출처 : 쉬운코드 - (1부) B tree의 개념과 특징, 데이터 삽입이 어떻게 동작하는지를 설명합니다! (DB 인덱스과 관련 있는 자료 구조)

 

 

 

'백엔드 > Database' 카테고리의 다른 글

[Database] SubQuery 종류  (0) 2024.07.14