본문으로 건너뛰기
SQL 기초집LESSON 20

INDEX와 EXPLAIN: 조회 성능 기초

난이도입문 → 초급
예상 시간30분
선수지식이전 강의

20강. INDEX와 EXPLAIN: 조회 성능 기초

1. 이번 강의에서 해결할 문제​

데이터가 늘면 기간과 플레이어 조건 조회가 전체 테이블을 훑을 수 있습니다. 감으로 인덱스를 추가하지 않고 실제 쿼리 계획을 비교합니다.

2. 학습 목표​

3. 핵심 개념​

인덱스는 별도 구조를 저장해 일부 조회를 빠르게 하지만 INSERT, UPDATE, DELETE와 저장 공간 비용을 늘립니다. SQLite 계획의 SCAN은 넓은 순회, SEARCH는 조건을 이용한 부분 탐색을 나타냅니다. 출력 형식은 버전 간 바뀔 수 있어 애플리케이션이 파싱하면 안 됩니다.

4. 단계별 SQL 예시​

대상 테이블: games, match_results; 인덱스 추가
파일 경로: C:\dev\game-ranking-db\sql\20-index.sql

sql/20-index.sql
-- 1. 인덱스 전 계획 기록
EXPLAIN QUERY PLAN
SELECT game_id, mode, started_at
FROM games
WHERE started_at >= '2026-07-01T00:00:00Z'
AND started_at < '2026-08-01T00:00:00Z'
ORDER BY started_at DESC;

-- 2. 실제 필터·정렬에 맞는 인덱스 추가
CREATE INDEX IF NOT EXISTS idx_games_started_at
ON games (started_at DESC);

CREATE INDEX IF NOT EXISTS idx_match_results_player_game
ON match_results (player_id, game_id);

-- 3. 같은 쿼리 계획 재확인
EXPLAIN QUERY PLAN
SELECT game_id, mode, started_at
FROM games
WHERE started_at >= '2026-07-01T00:00:00Z'
AND started_at < '2026-08-01T00:00:00Z'
ORDER BY started_at DESC;
PowerShell · 실행 순서
sqlite3 -header -box .\data\game_ranking.db ".read .\sql\20-index.sql"
sqlite3 .\data\game_ranking.db "PRAGMA index_list('games');"

5. 쿼리가 동작하는 이유​

started_at 인덱스는 범위 조건과 정렬 순서에 맞는 키를 제공합니다. 복합 인덱스는 왼쪽부터 활용되므로 player_id 조건 뒤 game_id 접근에 유리합니다. 계획에서 SEARCH와 사용 인덱스 이름을 비교합니다.

6. 자주 하는 실수와 안전한 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

INDEX와 EXPLAIN: 조회 성능 기초 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“INDEX와 EXPLAIN: 조회 성능 기초”에서 오류나 데이터 손실을 줄이는 선택은 무엇인가요?
  2. 문제 2“INDEX와 EXPLAIN: 조회 성능 기초” 실습 중 ‘인덱스 삭제를 즉시 실행’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

20강. INDEX와 EXPLAIN: 조회 성능 기초 미완료 상태