What I Learned/etc.

[CS] 인덱스

rilee 2025. 12. 31. 17:42
728x90

1. 인덱스의 필요성

  • 인덱스란 데이터를 빠르게 찾을 수 있는 하나의 장치
  • 인덱스를 설정하면 테이블에서 찾고자하는 데이터를 빠르게 검색 가능

2. B-트리

  • 보통 B-트리 자료 구조로 구성
    • 루트 노드 - 브랜치 노드 - 리프노드로 나뉨
  • 인덱스는 1) 효율적인 단계를 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조 2) 트리 깊이의 대수확장성 때문에 효율적
    • 대수확장성
      • 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 것
      • 인덱스가 한 깊이씩 증가할 때마다 최대 인덱스 항목의 수는 4배씩 증가

3. 인덱스를 만드는 방법

인덱스를 만드는 방법은 DB마다 다르다.

1) MySQL

  • 클러스터형 인덱스

    • 테이블당 하나만 설정 가능
    • PK 옵션으로 기본키를 만들면 클러스터형 인덱스 생성 가능
  • 세컨더리 인덱스

    • 보조 인덱스 → 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야 하는 인덱스
    • PK 옵션으로 unique not null 옵션을 붙이면 세컨더리 인덱스 생성 가능
    • create index … 의 명령어를 기반으로 생성시 세컨더리 인덱스 생성 가능
  • 하나의 인덱스만 생성할 거면 클러스터형 인덱스를 만드는게 성능이 좋음

  • e.g.

    [age]라는 필드로 쿼리를 보내면 클러스터형 인덱스로 충분.
    [age], [name], [email] 등 다양한 필드로 쿼리 보내려면 세컨더리 인덱스 필요

2) MongoDB

  • 도큐먼트 생성시 자동으로 ObjectID 형성 → 해당 키가 기본키로 설정
  • 세컨더리키를 부가적으로 설정해야 PK와 세컨더리키 같이 쓰는 복합인덱스 설정 가능

3) MSSQL


4. 인덱스 최적화 기법

인덱스 최적화 방법은 DB마다 다르지만, 기본적인 골조는 동일

1) “인덱스는 비용이다”

  • 인덱스 리스트 > 컬렉션 순으로 탐색하므로 인덱스는 두 번 탐색하도록 강요
  • 컬렉션이 수정되면 인덱스도 수정되어야 함
    (e.g. 책의 본문이 수정되면 목차/찾아보기가 수정되는 것)
  • 컬렉션에서 가져와야 하는 양이 많을수록 인덱스를 사용하는 건 비효율적

2) “항상 테스팅하라”

  • 인덱스 최적화 기법은 서비스 특징에 따라 달라지므로 테스트가 중요

3) “복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순”

  • 카디널리티: 유니크한 값의 정도

  • 여러 필드를 기반으로 조회 시 복합 인덱스를 생성하는데, 이 인덱스를 생성할 때 순서가 있다 → 생성 순서에 따라 인덱스 성능이 달라짐

  • 따라서 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 함!

728x90

'What I Learned > etc.' 카테고리의 다른 글

[CS] 비선형 자료 구조  (0) 2026.01.05
[CS] 복잡도  (0) 2026.01.05
[CS] ERD와 정규화 과정  (1) 2025.12.30
[CS] CPU 스케줄링 알고리즘  (0) 2025.12.24
[CS] 메모리 관리  (0) 2025.12.23