
인덱스는 검색 속도를 높이기 위해 사용하는 책의 찾아보기(색인)와 같은 자료구조입니다.
| 구분 | 인덱스가 없을 때 (Full Table Scan) | 인덱스가 있을 때 (Index Scan) |
|---|---|---|
| 비유 | 원하는 내용을 찾기 위해 책의 첫 장부터 끝까지 한 장씩 전부 넘겨가며 찾기 | 맨 뒤 '찾아보기'에서 "스프링 → 245p"를 확인하고 해당 페이지로 즉시 직행 |
| 작업량 | 모든 페이지(모든 행)를 일일이 확인해야 함 | 다른 페이지는 전혀 보지 않고 목표 페이지만 바로 확인 |
모든 컬럼에 인덱스를 걸면 쓰기 작업 성능이 저하되므로, 꼭 필요한 컬럼에만 선택적으로 설정해야 합니다.
WHERE 절에 빈번하게 사용되는 컬럼ORDER BY 기준이 되는 컬럼JOIN 조건으로 자주 엮이는 컬럼특정 월드(world_id)의 채팅 내역을 시간순(created_at)으로 빠르게 조회하기 위한 복합 인덱스(Composite Index)를 DDL과 JPA 엔티티 코드로 매핑하는 방법입니다.
CREATE INDEX idx_chat_world_created_at ON chat_messages(world_id, created_at);
@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)으로 정렬/조회하기 때문에 컬럼 선언 순서가 매우 중요합니다.