본문으로 건너뛰기
최서희Frontend Engineer
← 블로그

Backend

[매일메일] 데이터베이스 인덱스에 대해서 설명해주세요.

· 7분 읽기

데이터베이스 인덱스에 대해서 설명해주세요.


1. 직접 조사(구글링, 공식문서, 기술 포스팅 등으로 학습)

인덱스(Index)란?

  • 정의: 추가적인 쓰기 작업과 저장 공간을 사용하여 데이터베이스 테이블의 검색 속도를 향상시키는 자료구조

  • (책의 색인처럼 특정 데이터를 빠르게 찾을 수 있음)

  • 장점

    • SELECT 뿐만 아니라 UPDATE, DELETE도 먼저 대상을 빠르게 찾아야 하기 때문에 성능 향상에 도움.
    • Full Scan(테이블 전체 탐색)을 줄여 효율적인 검색 가능.
    -- 인덱스 생성
    CREATE INDEX idx_users_name ON users(name);
    
    -- 인덱스 사용 조회
    SELECT * FROM users WHERE name = 'Choi';
    
  • 단점

    • INSERT, DELETE, UPDATE 시 인덱스도 갱신해야 하므로 오버헤드 발생.
    • 인덱스 유지/관리에 추가 저장 공간(약 10% 이상) 필요.
    • 불필요하게 많은 인덱스를 만들면 오히려 성능 저하.
  • 적절한 사용 상황

    • 데이터가 많은 테이블.
    • INSERT/UPDATE/DELETE가 빈번하지 않은 컬럼.
    • WHERE, JOIN, ORDER BY에서 자주 사용되는 컬럼.
    • 중복도가 낮은 컬럼 (예: 주민번호, 이메일 등).

인덱스(Index)의 자료구조

1) 해시 테이블(Hash Table)

  • (Key, Value) 형태로 저장.

  • Key를 해싱 → 해시 버킷에서 Value를 바로 찾아감.

  • 시간 복잡도: 평균 O(1)

  • 장점

    • 등호(=) 검색에 매우 빠름.
    • SELECT * FROM users WHERE id = 100;
  • 단점

    • 범위 검색(>, <, BETWEEN, LIKE 'abc%') 불가능.
    • 정렬(ORDER BY) 불가능.
  • 활용

    • 캐시(DB가 아닌 메모리 저장소, 예: Redis)
    • 일부 DB 엔진에서 특별한 경우 사용.

2) B+Tree

  • 대부분의 RDBMS(MySQL InnoDB, Oracle, PostgreSQL 등)에서 기본 인덱스 구조.구조
    • 인덱스 노드(중간 노드): Key만 저장.
    • 리프 노드: Key + 데이터 위치 저장.
    • 리프 노드들은 Linked List로 연결되어 순차 탐색 가능.
  • 시간 복잡도: O(log n)
  • 장점
    • =, <, >, BETWEEN, LIKE 'abc%' 등 다양한 검색 연산 지원.
    • 정렬(ORDER BY) 최적화 가능.
    • 대규모 데이터에서 효율적.
  • 단점
    • 해시 테이블보다 단건 조회 속도는 느림.
    • 무조건 리프 노드까지 탐색해야 함.
  • 활용
    • MySQL(InnoDB) 기본 인덱스 구조.
    • PK(기본키), 일반 인덱스(Index), 유니크 인덱스(Unique Index) 모두 B+Tree 기반

3) 차이점 비교

  • 구분 Hash 인덱스 B-Tree 인덱스

    <table style="border-collapse: collapse; width: 100%;" border="1" data-ke-align="alignLeft"><tbody><tr><td><b>검색 방법</b></td><td>키를 해싱하여 해시 테이블에서 O(1) 시간에 직접 접근</td><td>루트부터 리프까지 탐색 (O(log n))</td></tr><tr><td><b>범위 검색</b></td><td>❌ 불가능 (모든 해시값 탐색 필요)</td><td>✅ 가능 (리프 노드가 연결되어 있어 순차 탐색 용이)</td></tr><tr><td><b>데이터 정렬</b></td><td>무작위 배치 (정렬 불가)</td><td>키 값 기준으로 정렬된 상태 유지</td></tr><tr><td><b>인덱스 크기</b></td><td>상대적으로 작음, 하지만 해시 충돌 시 비효율적</td><td>크기가 클 수 있으나 안정적</td></tr><tr><td><b>적용 가능성</b></td><td>정확한 값 검색(=)에 최적, PK나 고유 키 탐색에 유용</td><td>범위 검색, 정렬, 대부분의 쿼리에 유리 (RDBMS 기본 인덱스 구조)</td></tr></tbody></table>

    • Hash 인덱스는 "정확히 일치하는 검색"에 강하지만 범위/정렬 불가능.
    • B-Tree 인덱스는 범용성이 높아 실제 DB에서 가장 널리 쓰임.

2. 정답 확인(매일메일 해설)


3. 최종 정리

데이터베이스 인덱스

  • 정의: 책의 목차(색인)처럼, 추가 저장공간과 자료구조를 활용해 검색 속도를 빠르게 해주는 기능
  • 장점
    • SELECT, UPDATE, DELETE 속도 향상
    • 시스템 부하 감소
  • 단점
    • 저장 공간 필요(약 10%)
    • INSERT/UPDATE/DELETE 성능 저하 (인덱스 갱신 필요)
  • 대표 자료구조
    • B-Tree 인덱스: 범용, 정렬/범위 검색에 유리, O(log n)
    • Hash 인덱스: 정확히 일치 검색에 유리, O(1), 범위 검색 불가
  • 적용 시기
    • 규모가 큰 테이블
    • 검색·조인·정렬에 자주 쓰이는 컬럼
    • 중복도가 낮은 컬럼

🔗 참고 URL

댓글

GitHub 계정으로 댓글을 남길 수 있어요.