본문 바로가기
CS/DataBase

[DataBase] 인덱스란?

by BK0625 2025. 3. 26.
반응형

인덱스란 테이블의 특정 컬럼을 빠르게 조회할 수 있도록 만든 자료구조이다. 보통 B-Tree(Balanced Tree) 구조를 사용하여 빠른 탐색이 가능하다. 데이터를 직접 읽는 게 아니라 색인을 먼저 보고 해당 데이터 위치를 찾아가게 된다.

 

예제

blog 테이블에서 blog_category = 1인 데이터를 찾는 쿼리

SELECT * FROM blog WHERE blog_category = 1;

 

인덱스가 없으면

  • 데이터 전체를 처음부터 끝까지 풀 스캔(Full Table Scan)
  • 100만 개 중에서 10개만 필요해도 전부 읽어야 하기 때문에 느리다.

 

인덱스를 추가하면?

인덱스 = 책의 목차 같은 역할

CREATE INDEX idx_blog_category ON blog (blog_category);
  • 이제 blog_category 기준으로 정렬된 별도 자료구조(B-Tree)가 생김
  • 검색 시 인덱스를 먼저 보고, 해당 데이터가 저장된 위치로 바로 이동
  • 조회 속도 향상 (Full Scan → Index Scan)

 

다중 컬럼 인덱스 (Composite Index)

where blog_category = ? AND is_del = 1 같이 여러 개 조건을 검색할 때

CREATE INDEX idx_blog_category_isdel ON blog (blog_category, is_del);
  • 이제 (blog_category, is_del)을 동시에 필터링 가능
  • 필터링이 빠름 → 성능 최적화!

다만 (A,B) 순서로 인덱스를 만들면 A→B 순으로만 최적화가 되기 때문에 WHERE B = ? 같은 단독 조회는 최적화 되지 않음

 

 

정렬(ORDER BY) 최적화

ORDER BY release_at DESC가 빠르게 동작하려면

CREATE INDEX idx_blog_category_release ON blog (blog_category, is_del, release_at DESC);

 

인덱스에 미리 정렬된 형태로 저장된다. 쿼리 실행 시 추가 정렬 연산(filesort) 없이 바로 반환 가능

 

 

인덱스 실행 계획

인덱스가 잘 적용되는지 확인하는 방법

EXPLAIN SELECT * FROM blog WHERE blog_category = 1 AND is_del = 1 ORDER BY release_at DESC LIMIT 10;

 

 

📌 결과에서 중요한 항목

 

Column 의미
type index, range, ref 등이 나오면 최적화 성공
key 사용된 인덱스 이름
rows 읽어야 하는 예상 행 수 (작을수록 좋음)
Extra Using index가 나오면 최적화 성공, Using filesort가 나오면 추가 정렬 발생

 

 

인덱스의 단점

읽기는 빨라지지만 쓰기는 느려지며 너무 많은 인덱스를 만들면 오히려 성능이 저하되기 때문에 조회가 많은 컬럼에만, 또 데이터 변경이 적고, 자주 검색되는 컬럼에 인덱스를 활용하고 다중 컬럼 인덱스 사용 시 WHERE 절 조건을 분석하여 적절한 순서로 만들어야 한다.

반응형