PHpullh
학습 라이브러리/Python/데이터베이스 쿼리 최적화

PYTHON · 성능

데이터베이스 쿼리 최적화

N+1 문제, 인덱싱, 배치 처리 등 데이터베이스 성능 최적화 패턴입니다.

성능고급SQL쿼리 최적화N+1인덱스

핵심 설명

N+1 문제, 인덱싱, 배치 처리 등 데이터베이스 성능 최적화 패턴입니다.

Python code

import sqlite3
import time

# 테스트 DB 생성
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")
conn.execute("CREATE TABLE orders (id INTEGER PRIMARY KEY, "
             "user_id INTEGER, amount REAL)")

# 대량 데이터 삽입
conn.executemany("INSERT INTO users VALUES (?, ?)",
    [(i, f"User-{i}") for i in range(1000)])
conn.executemany("INSERT INTO orders VALUES (?, ?, ?)",
    [(i, i % 1000, i * 100) for i in range(10000)])
conn.commit()

# 안티패턴: N+1 쿼리
start = time.perf_counter()
users = conn.execute("SELECT id FROM users LIMIT 100").fetchall()
for (uid,) in users:
    conn.execute("SELECT SUM(amount) FROM orders WHERE user_id=?",
                 (uid,)).fetchone()
t1 = time.perf_counter() - start
print(f"N+1 쿼리: {t1:.4f}초 (101회 쿼리)")

# 최적화: JOIN으로 1회 쿼리
start = time.perf_counter()
conn.execute("""
    SELECT u.id, u.name, COALESCE(SUM(o.amount), 0)
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
    GROUP BY u.id
    LIMIT 100
""").fetchall()
t2 = time.perf_counter() - start
print(f"JOIN 쿼리: {t2:.4f}초 (1회 쿼리)")
print(f"속도 향상: {t1/t2:.1f}x")

# 인덱스 추가
conn.execute("CREATE INDEX idx_orders_user ON orders(user_id)")
start = time.perf_counter()
conn.execute("SELECT * FROM orders WHERE user_id = 500").fetchall()
t3 = time.perf_counter() - start
print(f"인덱스 조회: {t3:.6f}초")

conn.close()

학습 팁

EXPLAIN QUERY PLAN으로 쿼리 실행 계획을 확인하면 인덱스 사용 여부를 알 수 있습니다.

주의할 점

모든 컬럼에 인덱스를 추가하면 INSERT/UPDATE 성능이 저하됩니다. 자주 검색하는 컬럼에만 추가하세요.

자주 묻는 질문

데이터베이스 쿼리 최적화란 무엇인가요?

N+1 문제, 인덱싱, 배치 처리 등 데이터베이스 성능 최적화 패턴입니다.

데이터베이스 쿼리 최적화 학습 시 주의할 점은 무엇인가요?

모든 컬럼에 인덱스를 추가하면 INSERT/UPDATE 성능이 저하됩니다. 자주 검색하는 컬럼에만 추가하세요.

Continue Learning

Python 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.