본문 바로가기
C.W.K.
Stream
Lesson 02 of 10 · published

질의 모양 먼저, 색인은 다음

~12 min · operations, queries

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

데이터베이스에 불필요한 일을 시키지 마

필요한 열이 셋인데 SELECT *를 쓰거나, 쓰지 않는 테이블을 JOIN하거나, 순서가 필요 없는데 LIMIT 전에 ORDER BY를 수행하거나, 앱에서 거를 1만 행을 가져오면 색인이 나쁜 모양을 구해주지 못해. 반복해서 계산하는 비싼 표현식은 캐시하거나 미리 계산해.

최적화 순서

  1. 열과 행을 줄이고 필터·집계를 SQL로 옮겨.
  2. EXPLAIN에 문제가 남으면 색인을 더해.
  3. 자주 읽고 드물게 바뀌는 값만 캐시해.
  4. 정말 비싼 집계만 구체화된 뷰로 만들어.

Code

SELECT와 JOIN을 필요한 만큼만 쓰기·sql
-- 전: 세 테이블 모든 컬럼 가져오고 앱에서 필터
SELECT u.*, o.*, p.*
FROM   users u
LEFT JOIN orders o ON o.user_id = u.id
LEFT JOIN products p ON p.id = o.product_id;

-- 후: 필요한 컬럼과 행만
SELECT u.id, u.name, o.id AS order_id, o.total
FROM   users u
JOIN   orders o ON o.user_id = u.id
WHERE  o.placed_at >= now() - INTERVAL '30 days';
집계를 SQL에 맡기기·sql
-- 전: 10만 행 가져와서 Python 에서 aggregate
rows = db.execute("SELECT total FROM orders WHERE customer_id = %s", (cid,)).fetchall()
total = sum(r[0] for r in rows)

-- 후: 한 쿼리가 한 숫자 반환
total = db.execute(
    "SELECT SUM(total) FROM orders WHERE customer_id = %s", (cid,)
).fetchone()[0]

External links

Exercise

프로젝트에서 가장 느린 질의를 골라 색인을 만지기 전에 모양부터 점검해. 반환하지만 쓰지 않는 열, 조건 없이 넓게 잇는 JOIN, 앱 코드 대신 SQL이 맡을 수 있는 집계를 찾아 하나씩 바꾸고 매번 다시 측정해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.