DB 쿼리가 느릴 때 확인해야 할 것

2025. 3. 24. 16:55·SQL
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
'SQL' 카테고리의 다른 글
  • 데이터 무결성 검증을 위한 SQL Test 작성법
  • SQL에서 WHERE 1=1을 사용하는 이유는?
  • [SQL] IN 과 JOIN의 대한 궁금중
  • [SQL] Date Format 함수 (formatting parameter)
Balang
Balang
음악 전공생의 개발일지
  • Balang
    Balang
    Balang
  • 전체
    오늘
    어제
  • 반응형
    • All Post (147)
      • python (45)
        • selenium (4)
        • algorithm (9)
        • Django (6)
        • Pandas | Numpy (22)
      • SQL (9)
      • Data Engineer (29)
      • Data Scientist (3)
      • Data Analysis (9)
      • Computer Science (35)
      • Why? (15)
      • 마음가짐 (2)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Balang
DB 쿼리가 느릴 때 확인해야 할 것
상단으로

티스토리툴바