쿼리
Query
데이터베이스에서 정보를 요청하는 명령. SQL SELECT가 대표적. 쿼리 최적화가 성능의 핵심.
Query
데이터베이스에서 정보를 요청하는 명령. SQL SELECT가 대표적. 쿼리 최적화가 성능의 핵심.
쿼리(Query)는 데이터베이스에 정보를 요청하는 명령문입니다. SQL(Structured Query Language)을 사용하여 데이터를 조회(SELECT), 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)할 수 있습니다. 효율적인 쿼리 작성은 애플리케이션 성능의 핵심입니다.
SELECT 쿼리는 가장 많이 사용되는 유형으로, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT 절로 구성됩니다. 각 절은 정해진 순서로 실행되며, 이를 이해하면 복잡한 쿼리도 논리적으로 분석할 수 있습니다.
쿼리 최적화는 실행 계획(EXPLAIN) 분석에서 시작합니다. 인덱스 사용 여부, 조인 방식, 예상 행 수 등을 확인하고, 필요한 경우 인덱스 추가나 쿼리 재작성으로 성능을 개선합니다. 일반적으로 Full Table Scan을 피하고 인덱스를 활용하도록 합니다.
파라미터화된 쿼리(Prepared Statement)는 SQL 인젝션을 방지하고 쿼리 캐싱을 가능하게 합니다. 동적으로 쿼리를 생성할 때도 반드시 파라미터 바인딩을 사용해야 합니다.
-- 기본 SELECT
SELECT id, name, email
FROM users
WHERE status = 'active'
ORDER BY created_at DESC
LIMIT 10;
-- 집계 함수와 GROUP BY
SELECT category, COUNT(*) as count, AVG(price) as avg_price
FROM products
GROUP BY category
HAVING COUNT(*) > 5;
-- CTE (Common Table Expression)
WITH monthly_sales AS (
SELECT DATE_TRUNC('month', order_date) as month,
SUM(total) as revenue
FROM orders
GROUP BY 1
)
SELECT month, revenue,
revenue - LAG(revenue) OVER (ORDER BY month) as growth
FROM monthly_sales;
-- 서브쿼리
SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);
-- UPSERT (있으면 업데이트, 없으면 삽입)
INSERT INTO users (email, name)
VALUES ('test@example.com', 'Test')
ON DUPLICATE KEY UPDATE name = VALUES(name);
-- Python에서 파라미터화된 쿼리
cursor.execute(
"SELECT * FROM users WHERE email = %s AND status = %s",
(email, 'active') # SQL 인젝션 방지
)
시니어: 이 쿼리가 프로덕션에서 3초나 걸리네요. 로컬에서는 빨랐나요?
주니어: 네, 데이터가 적어서 빨랐어요. 어떻게 최적화하죠?
시니어: EXPLAIN ANALYZE로 실제 실행 시간을 확인하세요. 조인 순서나 인덱스 누락을 찾을 수 있어요.
면접관: SELECT 쿼리의 실행 순서를 설명해주세요.
지원자: FROM과 JOIN이 먼저 실행되어 데이터 소스를 결정하고, WHERE로 필터링합니다. 그 다음 GROUP BY로 그룹화하고 HAVING으로 그룹을 필터링합니다. SELECT로 컬럼을 선택하고, ORDER BY로 정렬한 뒤 LIMIT로 개수를 제한합니다.
면접관: 파라미터화된 쿼리의 장점은요?
지원자: SQL 인젝션 공격을 원천 차단하고, DB가 쿼리 계획을 캐싱할 수 있어 성능이 향상됩니다. 문자열 연결로 쿼리를 만들면 안 됩니다.
리뷰어: SELECT *는 피하는 게 좋아요. 필요한 컬럼만 명시하세요.
작성자: 편의상 *로 했는데 왜 문제인가요?
리뷰어: 불필요한 데이터 전송, 커버링 인덱스 활용 불가, 스키마 변경 시 예상치 못한 영향이 있어요.