본문으로 건너뛰기

주문 목록 쿼리가 3초 넘게 걸려요. 왜 느린지 봐 주세요. SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at DESC LIMIT 20;

원인

orders 표에 customer_id로 찾는 인덱스가 없으면 표 전체를 읽은 뒤 정렬해요. 주문이 많을수록 느려지는 이유예요.

고치는 순서

  1. 실행 계획을 먼저 봐요. Seq Scan이 보이면 인덱스가 없는 거예요.
  2. 찾는 열과 정렬하는 열을 함께 묶은 인덱스를 만들어요.
  3. 꼭 필요한 열만 고르도록 SELECT *를 바꿔요.
sql
EXPLAIN ANALYZESELECT id, status, total, created_atFROM ordersWHERE customer_id = 42ORDER BY created_at DESCLIMIT 20;
CREATE INDEX orders_customer_created_idx  ON orders (customer_id, created_at DESC);

인덱스를 만든 뒤 다시 EXPLAIN ANALYZE를 돌리면 Index Scan으로 바뀌고 시간이 몇 밀리초로 줄어요.

Deep
인덱스를 만들면 쓰기가 느려지지 않아요?

조금 느려져요. 주문을 넣을 때마다 인덱스도 함께 고쳐야 하니까요.

그래도 이 경우에는 만드는 편이 나아요.

  • 주문 목록은 넣는 것보다 읽는 일이 훨씬 많아요.
  • 인덱스 하나가 늘리는 쓰기 시간은 보통 아주 작아요.
  • 쓰지 않는 인덱스가 쌓이는 것이 더 문제예요. 가끔 사용 통계를 보고 지우세요.
Balanced

Claude와 관계없는 연습용 서비스예요. 데이터는 모두 예시예요.

Claude와 관계없는 연습용 서비스예요. 데이터는 모두 예시예요.