내일배움캠프 13일차 TIL - 데이터베이스 인덱스(@Index)

정광훈(단기심화_9기)·2026년 9월 16일

TIL (Today I Learned)

목록 보기
122/127
post-thumbnail

[DB/JPA] 데이터베이스 인덱스(Index) 개념과 JPA 복합 인덱스 매핑 (@Table @Index)


1. 인덱스(Index)란?

인덱스는 검색 속도를 높이기 위해 사용하는 책의 찾아보기(색인)와 같은 자료구조입니다.

  • 동작 원리: 데이터를 미리 정렬하고 구조화하여 원하는 데이터의 위치를 빠르게 찾아갈 수 있게 해줍니다.
  • 트레이드오프(Trade-off): 검색(조회) 속도는 빨라지지만, 데이터 변경(추가, 수정, 삭제) 작업은 추가적인 인덱스 갱신 작업 때문에 약간 느려집니다.

2. 책으로 이해하는 인덱스 비유

구분인덱스가 없을 때 (Full Table Scan)인덱스가 있을 때 (Index Scan)
비유원하는 내용을 찾기 위해 책의 첫 장부터 끝까지 한 장씩 전부 넘겨가며 찾기맨 뒤 '찾아보기'에서 "스프링 → 245p"를 확인하고 해당 페이지로 즉시 직행
작업량모든 페이지(모든 행)를 일일이 확인해야 함다른 페이지는 전혀 보지 않고 목표 페이지만 바로 확인

3. 인덱스는 어떤 컬럼에 걸어야 할까?

모든 컬럼에 인덱스를 걸면 쓰기 작업 성능이 저하되므로, 꼭 필요한 컬럼에만 선택적으로 설정해야 합니다.

  • 자주 검색하는 조건 컬럼: WHERE 절에 빈번하게 사용되는 컬럼
  • 자주 정렬하는 컬럼: ORDER BY 기준이 되는 컬럼
  • 테이블을 연결하는 컬럼: JOIN 조건으로 자주 엮이는 컬럼

4. SQL 인덱스를 JPA Entity에 적용하기

특정 월드(world_id)의 채팅 내역을 시간순(created_at)으로 빠르게 조회하기 위한 복합 인덱스(Composite Index)를 DDL과 JPA 엔티티 코드로 매핑하는 방법입니다.

📌 DDL (SQL)

CREATE INDEX idx_chat_world_created_at ON chat_messages(world_id, created_at);

📌 JPA Entity 매핑 (@Table, @Index)

@Getter
@Entity
@Table(name = "chat_messages",
    indexes = {
        // chat_messages 테이블에 idx_chat_world_created_at이라는 이름의 인덱스를 생성
        // world_id로 필터링하면서 created_at 순으로 정렬/조회 최적화
        @Index(name = "idx_chat_world_created_at", columnList = "world_id, created_at")
    }
)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class ChatMessage {
    ...
}
  • name: 데이터베이스에 생성될 인덱스의 고유 이름을 지정합니다.
  • columnList: 인덱스로 묶을 컬럼 목록을 콤마(,)로 구분해 순서대로 작성합니다.
  • 복합 인덱스 순서의 중요성: 앞 컬럼(world_id)으로 먼저 필터링하고 뒤 컬럼(created_at)으로 정렬/조회하기 때문에 컬럼 선언 순서가 매우 중요합니다.
profile
내배캠 Unity_9기 / 게임 서버 단기 심화_9기

0개의 댓글