728x90
실무에서 쿼리 속도가 느릴 때 가장 먼저 확인해야 하는 것 중 하나는 인덱스입니다.
이 글에서는 인덱스가 무엇인지, 실제 실무에서 어떻게 활용할 수 있는지, 정리해 보겠습니다.
인덱스란?
- 인덱스(INDEX) : 데이터베어스 테이블의 특정 컬럼에 대한 검색 속도를 높이는 자료구조 입니다.
- 우리가 도서관에서 책의 목차를 활용해서 빠르게 찾듯이 특정 데이터를 빠르게 찾도록 도와주는 역할을 합니다.
인덱스가 없는 경우
SELECT * FROM users WHERE email = 'test@example.com';
email
컬럼에 인덱스가 없다면 전체 테이블을 훑는 Full Table Scan 발생- 테이블이 수십만 건 이상이면 성능이 급격히 저하됨
인덱스가 있는 경우
CREATE INDEX idx_users_email ON users(email);
- B-Tree 인덱스를 통해 빠르게 검색 가능
- 해당 컬럼에 대한
WHERE
,ORDER BY
,JOIN
시 성능이 크게 향상됨
예를 들어 이메일 중복 체크 쿼리가 있다고 가정을 하겠습니다.
SELECT COUNT(*) FROM users WHERE email = 'user@test.com';
- 인덱스 없을 경우 전체 스캔으로 매우 느림
- 유니크 인덱스를 걸면 성능 향상 + 데이터 무결성 확보 가능
CREATE UNIQUE INDEX idx_users_email ON users(email);
인덱스 에러 핸들링
1. 중복값으로 인한 UNIQUE INDEX 생성 실패
CREATE UNIQUE INDEX idx_users_email ON users(email);
-- ERROR: Key (email)=(user@test.com) is duplicated.
해결 방법
- 중복 데이터 제거 후 인덱스 생성
-- 중복 이메일 확인
SELECT email, COUNT(*) FROM users
GROUP BY email
HAVING COUNT(*) > 1;
-- 중복 제거 후 인덱스 생성
DELETE FROM users WHERE id IN (...);
다만 인덱스가 있다고 해서 무조건 성능이 좋은 것은 아닙니다.
SELECT * FROM orders WHERE status = 'DELIVERED' AND created_at > NOW() - INTERVAL '7 days';
status
,created_at
각각 인덱스 있어도 제대로 활용 못하는 경우가 있습니다.- 이를 해결하기 위해서는 복합 인덱스를 사용해야 합니다.
CREATE INDEX idx_orders_status_created_at ON orders(status, created_at);
- 여기서 중요한 것은 인덱스의 순서를
status -> created_at
순서대로 WHERE 조건에 맞아야 합니다.
쿼리 분석 도구 EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
Index Scan
-> 인덱스 사용Seq Scan
-> 전체 테이블 스캔 => 인덱스 적용 필요
결과
Index Scan using idx_users_email on users (cost=0.29..8.30 rows=1 width=100)
Index Scan
이 보이면 인덱스가 잘 적용된 상태라고 보시면 되겠습니다.
자주 쓰는 인덱스 전략
상황 | 인덱스 전략 |
WHERE 조건 자주 사용 | 해당 컬럼에 단일 인덱스 |
여러 컬럼 WHERE 조건 | 순서에 맞춰 복합 인덱스 |
ORDER BY 많음 | 정렬 대상 컬럼 인덱스 |
데이터 삽입/수정 많음 | 인덱스 최소화 고려 |
중복 허용 안 됨 | UNIQUE 인덱스로 무결성 확보 |
총 정리
- 인덱스는 쿼리 성능을 극적으로 개선할 수 있는 핵심 기술이다.
EXPLAIN ANALYZE
로 인덱스 사용 여부 및 쿼리 비용 확인 가능- 무조건 인덱스를 추가하기보단, 쿼리 패턴에 맞춰 설계해야 한다.
- 복합 인덱스의 순서와 중복 체크에 주의
INSERT/UPDATE
성능 저하 방지를 위해 인덱스는 꼭 필요한 만큼만 사용
쿼리 성능이 느리다고 느껴질 때, 가장 먼저 확인해야 할 것 중 하나는 인덱스입니다.
인덱스는 단순한 성능 향상 도구가 아니라, 데이터베이스 구조 설계의 핵심입니다.
긴 글 읽어주셔서 감사합니다.
728x90
반응형
'SQL' 카테고리의 다른 글
데이터 무결성 검증을 위한 SQL Test 작성법 (0) | 2025.03.26 |
---|---|
SQL에서 WHERE 1=1을 사용하는 이유는? (0) | 2025.03.14 |
[SQL] IN 과 JOIN의 대한 궁금중 (0) | 2024.04.23 |
[SQL] Date Format 함수 (formatting parameter) (1) | 2024.03.28 |
[MYSQL] 함수 만들기 (FUNCTION) (0) | 2024.03.20 |