Daily Dev Q&A: 관계형 데이터베이스의 인덱스

2026. 1. 27. 09:43·Archive/Daily Dev Q&A

Topic (오늘의 주제)

관계형 데이터베이스(RDB)의 인덱스 (Index)

Why (왜 사용하는가? 왜 중요한가?)

  • 실무: 인덱스가 없으면 데이터베이스는 원하는 데이터를 찾기 위해 테이블의 처음부터 끝까지 다 뒤져야 합니다 (Full Table Scan). 데이터가 수백만 건일 때 인덱스가 없으면 조회 성능이 치명적으로 느려져 서비스 장애로 이어집니다.
  • 구조적 의미: 책의 '색인(목차)'과 같습니다. 데이터의 저장 위치(포인터)를 키(Key)와 함께 별도의 구조(B-Tree 등)로 저장하여 검색 속도를 비약적으로 높이는 기술입니다. 단, 저장 공간을 추가로 사용하고 데이터 변경 시 인덱스도 수정해야 하므로 쓰기 성능을 희생하여 읽기 성능을 얻는 트레이드오프(Trade-off)가 있습니다.
  • 면접 의도: DB 튜닝의 가장 기본이 되는 개념입니다. 단순히 "빠르다"를 넘어, 어떤 자료구조(B-Tree)를 쓰는지, 언제 인덱스를 걸어야 효율적인지(카디널리티), Clustered와 Non-Clustered의 차이를 아는지 확인합니다.

Core Concept (핵심 개념 정리)

요소 내용
개념 정의 테이블의 검색 속도를 향상시키기 위한 자료구조. (데이터 = 책의 내용, 인덱스 = 책의 색인)
동작 방식 주로 B-Tree (Balanced Tree) 또는 B+Tree 구조를 사용. 데이터를 정렬된 상태로 유지하여 탐색 시 **O(log N)**의 시간 복잡도를 가짐.
장점 1. 검색(SELECT) 속도가 매우 빠름.

2. 시스템 부하(CPU, Disk I/O)를 줄여 전체 성능 향상.
단점 1. 인덱스를 위한 추가 저장 공간(약 10% 내외) 필요.

2. INSERT, UPDATE, DELETE 시 인덱스도 재정렬해야 하므로 쓰기 속도 저하.
종류 1. Clustered Index: 실제 데이터 자체가 정렬됨. 테이블당 1개만 존재 (주로 PK). 리프 노드가 실제 데이터.

2. Non-Clustered Index: 별도의 인덱스 페이지 생성. 테이블당 여러 개 가능. 리프 노드가 데이터의 주소(포인터)를 가짐.

Interview Answer Version (면접 답변식 요약)

"인덱스는 데이터베이스 테이블의 검색 속도를 높여주는 자료구조입니다. 책의 맨 뒤에 있는 색인처럼 동작하며, 주로 B-Tree 구조를 사용하여 데이터를 정렬된 상태로 관리합니다. 인덱스를 사용하면 SELECT 쿼리의 성능은 크게 향상되지만, 데이터를 추가하거나 수정할 때 인덱스도 함께 재정렬해야 하므로 INSERT, UPDATE, DELETE 성능은 다소 저하될 수 있습니다. 따라서 데이터의 변경 빈도와 조회 빈도를 고려하여 적절히 설계하는 것이 중요합니다."

Practical Tip (사용시 주의할 점 or 활용 예)

1. 카디널리티(Cardinality)가 높은 컬럼에 적용하라

  • 카디널리티: 데이터의 중복도가 낮고 고유한 값의 개수가 많은 정도.
  • Good: 주민등록번호, ID, 이메일, 전화번호 (중복이 거의 없음 → 인덱스 효과 좋음)
  • Bad: 성별(남/여), 예/아니오 (중복이 매우 많음 → 인덱스를 타도 절반을 읽어야 하므로 효과 미비)

2. 복합 인덱스(Composite Index)와 컬럼 순서

  • 여러 컬럼을 묶어서 인덱스를 만들 때 순서가 매우 중요합니다.
  • 예: (A, B)로 인덱스를 만들면 A로 정렬된 후 B로 정렬됩니다. 따라서 WHERE B = ? 조건만으로는 이 인덱스를 탈 수 없습니다. (Leftmost Prefix Rule)

3. 과도한 인덱스 생성 금지

  • 인덱스는 공짜가 아닙니다. 불필요한 인덱스는 데이터베이스 사이즈를 키우고, 쓰기 작업 시 오버헤드를 발생시킵니다. 실제 쿼리의 **실행 계획(Explain)**을 분석하여 사용하지 않는 인덱스는 제거해야 합니다.

예상 꼬리질문 정리

Q1. 왜 인덱스로 해시(Hash)가 아닌 B-Tree(또는 B+Tree)를 주로 사용하나요?

  • 핵심 키워드: 해시 인덱스는 O(1)로 매우 빠르지만 **동등 비교(=)**만 가능합니다. DB에서는 **부등호(<, >)**나 **범위 검색(BETWEEN)**이 빈번한데, B-Tree는 데이터가 정렬되어 있어 범위 검색에 훨씬 유리하기 때문입니다.

Q2. Clustered Index와 Non-Clustered Index의 차이는 무엇인가요?

  • 핵심 키워드: Clustered는 책의 본문이 페이지 순서대로 정렬된 것(사전)과 같아 테이블당 1개만 존재하며 조회 속도가 가장 빠릅니다. Non-Clustered는 책 뒤의 색인(목차)과 같아 별도의 공간에 저장되며 테이블당 여러 개 만들 수 있지만, 실제 데이터를 찾기 위해 한 번 더 접근해야 하므로 Clustered보다 약간 느립니다.

Q3. '커버링 인덱스(Covering Index)'란 무엇인가요?

  • 핵심 키워드: 쿼리가 요구하는 모든 컬럼이 인덱스에 포함되어 있어, 실제 데이터 테이블(디스크)을 읽지 않고 인덱스만 읽어서 쿼리를 완료하는 것을 말합니다. Disk I/O가 줄어들어 성능이 비약적으로 향상됩니다.

'Archive > Daily Dev Q&A' 카테고리의 다른 글

Daily Dev Q&A: 데이터베이스 동시성 이슈  (0) 2026.01.29
Daily Dev Q&A: 트랜잭션과 인덱스의 관계  (0) 2026.01.29
Daily Dev Q&A: Cookie vs Session  (0) 2026.01.23
Daily Dev Q&A: HTTP vs HTTPS  (0) 2026.01.22
Daily Dev Q&A: GET vs POST (개념 및 데이터 흐름)  (0) 2026.01.21
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: 데이터베이스 동시성 이슈
  • Daily Dev Q&A: 트랜잭션과 인덱스의 관계
  • Daily Dev Q&A: Cookie vs Session
  • Daily Dev Q&A: HTTP vs HTTPS
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    backend
    Project_Review
    프로덕트개발자
    프로젝트회고
    커리어리셋
    SpringBoot
    spring
    REACT
    DevFestIncheon2025
    jpa
    OrphanRemova
    devlog
    데브페스트
    aws_s3
    java
    클로드코드
    Spring비교
    network
    경기기후바이브코딩
    til
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: 관계형 데이터베이스의 인덱스
상단으로

티스토리툴바