Indexing(인덱싱)은 데이터베이스에서 검색 속도를 빠르게 하기 위한 핵심 기술이다.
간단히 말하면, 책의 목차와 같은 역할을 한다.
테이블의 특정 컬럼에 대한 검색을 빠르게 하기 위한 자료구조
-- 예: title 컬럼에 인덱스를 생성
CREATE INDEX idx_post_title ON post(title);
post 테이블의 title 컬럼에 인덱스를 추가한 것이다.➡️ 언제든지 DB에 바로 적용 가능하기 때문에 → 운영 환경 / 성능 튜닝 시 권장된다.
@Entity
@Table(name = "post", indexes = {
@Index(name = "idx_post_title", columnList = "title")
})
public class Post {
@Id
private Long id;
private String title;
// ...
}
spring.jpa.hibernate.ddl-auto=create 또는 update 옵션이 켜져 있어야 동작한다.➡️ JPA 자동 스키마 생성 시 함께 적용되기 때문에 → 개발 초기 / 테스트용으로 권장 된다.
SHOW INDEX FROM post;
인덱스는 조회 성능을 높이지만 단점도 있다:
| 장점 | 단점 |
|---|---|
| 빠른 검색 속도 | 인덱스가 많아질수록 INSERT/UPDATE 성능 저하 |
| 정렬이 빠름 | 디스크 공간 사용량 증가 |
| 특정 조건에만 도움 | 조건이 모호하면 인덱스 무시될 수 있음 |
LIKE '%abc'← 이런 건 인덱스를 사용 못할 수도 있음 (접미사는 인덱스 미적용 가능)
| 항목 | 설명 |
|---|---|
| 정의 | 특정 컬럼에 대해 빠르게 검색할 수 있게 만든 데이터 구조 |
| 생성 방법 (JPA) | @Index 사용 or DB 직접 생성 |
| 효과 | 검색 성능 향상 |
| 주의 | 너무 많은 인덱스는 오히려 성능 저하 |
게시글 제목(title)을 기반으로 하는 검색 API를 개선하는 케이스를 전제로 인덱싱을 더 이해해보았다.
검색 기능은 유저 경험에 직접적인 영향을 주는 핵심 요소이기 때문에 검색 기능에 인덱스를 적용해보았고,
이번 인덱스 최적화를 통해 실시간 검색 처리 속도를 획기적으로 향상시킬 수 있었다.
SELECT * FROM post WHERE title LIKE '롤%';
선텍 이유:
/api/v1/posts/search?keyword=롤 형태로 사용자가 게시글 제목 검색을 자주 수행함post 테이블의 title 컬럼에 대해 LIKE 조건으로 검색이 자주 발생CREATE INDEX idx_post_title ON post(title);
idx_post_title: 제목(title) 컬럼에 대한 일반 인덱스LIKE '롤%')에 B-Tree 인덱스가 활용됨➡️ Sprin JPA에서는 어노테이션으로 DDl 생성 시점에 이 쿼리를 이미 인덱스도 자동 생성되기 때문에 쿼리를 작성할 필요 없다.
테스트 환경 : 데이터 100만건 삽입할 때
| Before(인덱스❌) | After(인덱스⭕) |
|---|---|
EXPLAIN SELECT * FROM post WHERE title LIKE '롤%'; | EXPLAIN SELECT * FROM post WHERE title LIKE '롤%'; |
type: ALL | type: range |
key: NULL | key: idx_post_title |
rows: 1000000 | rows: 50 (예시) |
| ➡️ Full Table Scan 발생 | ➡️ 인덱스 스캔 → 검색 속도 향상 |
B-Tree 인덱스는 MySQL을 포함한 대부분의 RDBMS(관계형 데이터베이스)에서 기본적으로 사용하는 인덱스 방식을 말한다.
데이터를 정렬된 상태로 트리 구조에 저장하는 방식 → 데이터 검색, 삽입, 삭제가 빠르다.
"Balanced" → 트리의 높이가 균형을 유지해서 탐색 성능이 일정하게 유지됨
"Tree" → 이진 탐색보다 더 많은 자식을 가질 수 있어서 대용량 데이터 처리에 적합
![]() |
|---|
WHERE, ORDER BY, LIKE 'abc%', BETWEEN 등title 컬럼 값이 아래와 값다고 했을 때
Apple, Banana, Cherry, Dog, Elephant, Fox
이걸 그냥 저장하면 검색 시 순차적으로 전부 훑어야 한다 → 느림
하지만 B-Tree 인덱스를 걸면, 다음과 같이 저장된다
Dog
/ \
Banana Fox
/ \ /
Apple Cherry Elephant