반응형
인덱스란 테이블의 특정 컬럼을 빠르게 조회할 수 있도록 만든 자료구조이다. 보통 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 절 조건을 분석하여 적절한 순서로 만들어야 한다.
반응형
'CS > DataBase' 카테고리의 다른 글
[DB] MVCC(다중 버전 동시성 제어) (0) | 2025.03.26 |
---|---|
[SQL] SQL 실행 순서에 대해서 (0) | 2025.02.18 |
[Redis] redis,docker로 멀티서버에서 pub/sub 실습해보기 (0) | 2025.02.09 |
[DataBase] 외래키(Foreign Key)에 관한 고찰... (0) | 2025.01.06 |
[DataBase] 관계형 데이터 베이스 (2) | 2024.08.06 |