fos-blog/study
01 / 홈02 / 카테고리
01 / 홈02 / 카테고리

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • langgraph 페이지로 이동
    • agents.md
    • BMAD Method — AI 에이전트로 애자일 개발하는 방법론
    • Claude Code의 Skill 시스템 - 개발자를 위한 AI 자동화의 새로운 차원
    • Claude Code를 5주 더 쓴 결과 — 스킬·CLAUDE.md를 키워가는 방식
    • Claude Code를 11일 동안 쓴 결과 — 데이터로 본 나의 사용 패턴
    • Claude Code 멀티 에이전트 — Teams
    • AI 에이전트와 디자인의 새 컨벤션 — DESIGN.md, Google Stitch, Claude Design
    • 하네스 엔지니어링 실전 — 4인 에이전트 팀으로 코딩 파이프라인 구축하기
    • 하네스 엔지니어링 — 오래 실행되는 AI 에이전트를 위한 설계
    • 멀티모달 LLM (Multimodal Large Language Model)
    • AI 에이전트와 함께 MVP 만들기 — dooray-cli 사례
  • ai 페이지로 이동
    • agent 페이지로 이동
  • algorithm 페이지로 이동
    • live-coding 페이지로 이동
    • 분산 계산을 위한 알고리즘
  • architecture 페이지로 이동
    • [초안] 시니어 백엔드를 위한 API 설계 실전 스터디 팩 — REST · 멱등성 · 페이지네이션 · 버전 전략
    • [초안] API Versioning과 Backward Compatibility: 시니어 백엔드 관점 정리
    • 캐시 설계 전략 총정리
    • [초안] CJ푸드빌 커머스/F&B 도메인 설계 면접 대비 — 슬롯 경험을 주문·결제·쿠폰·매장 상태 설계로 번역하기
    • [초안] 커머스 Spring 서비스에 Clean/Hexagonal Architecture를 실용적으로 적용하기
    • [초안] 커머스 주문 상태와 데이터 정합성 기본기 — CJ푸드빌 면접 대비
    • [초안] 쿠폰/프로모션 동시성과 정합성 기본기 — 선착순·중복 사용 방지·발급/사용/복구
    • [초안] DDD와 도메인 모델링: 시니어 백엔드 관점의 전술/전략 패턴 실전 가이드
    • [초안] Decorator & Chain of Responsibility — 행동을 체인으로 조립하는 두 가지 방식
    • 디자인 패턴
    • [초안] 분산 아키텍처 완전 정복: Java 백엔드 시니어 인터뷰 대비 실전 가이드
    • [초안] 분산 트랜잭션과 Outbox 패턴 — 왜 2PC를 피하고 어떻게 대신할 것인가
    • 분산 트랜잭션
    • [초안] e-Commerce 주문·결제 도메인 모델링: 상태머신, 멱등성, Outbox/Saga 실전 정리
    • [초안] F&B 쿠폰·프로모션·멤버십·포인트 설계
    • [초안] F&B · e-Commerce 디지털 채널 도메인 한 장 정리 — CJ푸드빌 디지털 채널 백엔드 면접 대비
    • [초안] F&B 주문/매장/픽업 상태머신 설계 — CJ푸드빌 디지털 채널 백엔드 관점
    • [초안] F&B 이커머스 결제·환불·정산 운영 가이드
    • [초안] Hexagonal / Clean Architecture를 Spring 백엔드에 적용하기
    • [초안] 대규모 커머스 트래픽 처리 패턴 — 1,600만 고객과 올영세일을 버티는 설계
    • [초안] 레거시 JSP/jQuery 화면과 신규 API가 공존하는 백엔드 운영 전략
    • [초안] MSA 서비스 간 통신: Redis [Cache-Aside](../database/redis/cache-aside.md) × Kafka 이벤트 하이브리드 설계
    • [초안] Observability 입문: 시니어 백엔드가 장애를 탐지하고 대응하는 방식
    • [초안] Outbox / Inbox Pattern 심화 — 분산 메시징의 정합성 문제를 DB 트랜잭션으로 풀어내기
    • [초안] 결제 도메인 멱등성과 트랜잭션 재시도 기본기
    • [초안] 시니어 백엔드를 위한 Resilience 패턴 실전 가이드 — Timeout, Retry, Circuit Breaker, Bulkhead, Backpressure
    • [초안] REST API 버저닝과 모바일 앱 하위 호환성 — CJ푸드빌 디지털 채널 백엔드 관점
    • [초안] Strategy Pattern — 분기문을 없애는 설계, 시니어 백엔드 인터뷰 핵심 패턴
    • [초안] 시니어 백엔드를 위한 시스템 설계 입문 스터디 팩
    • [초안] 템플릿 메서드 패턴 - 백엔드 처리 골격을 강제하는 가장 오래되고 가장 위험한 패턴
    • [초안] 대규모 트래픽 중 무중단 마이그레이션 — Feature Flag + Shadow Mode 실전
  • database 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • redis 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • 커넥션 풀 크기는 얼마나 조정해야 할까?
    • 인덱스 - DB 성능 최적화의 핵심
    • [초안] JPA N+1과 커머스 조회 모델: 주문/메뉴/쿠폰 도메인에서 살아남기
    • [초안] MyBatis 기본기 — XML Mapper, resultMap, 동적 SQL, 운영 패턴 정리
    • [초안] MyBatis와 JPA/Hibernate 트레이드오프 — 레거시 백엔드를 다루는 시니어 관점
    • 역정규화 (Denormalization)
    • 데이터 베이스 정규화
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • observability 페이지로 이동
    • [초안] 커머스/F&B 채널 장애 첫 5분과 관측성 기본기
    • Envoy Proxy
    • [초안] F&B / e-Commerce 운영 장애 대응과 모니터링 — 백엔드 관점 정리
    • Graceful Shutdown
  • finance 페이지로 이동
    • industry-cycle 페이지로 이동
    • investing 페이지로 이동
    • stock-notes 페이지로 이동
  • http 페이지로 이동
    • HTTP Connection Pool
  • interview 페이지로 이동
    • [초안] AI 서비스 팀 경험 기반 시니어 백엔드 면접 질문 뱅크 — Spring Batch RAG / gRPC graceful shutdown / 전략 패턴 / 12일 AI 웹툰 MVP
    • [초안] CJ푸드빌 디지털 채널 Back-end 개발자 직무 분석
    • [초안] CJ푸드빌 디지털 채널 Back-end 면접 답변집 — 슬롯 도메인 경험을 커머스/F&B 설계로 번역하기
    • [초안] F&B / e-Commerce 운영 모니터링과 장애 대응 인터뷰 정리
    • Observability — 면접 답변 프레임
    • [초안] 시니어 Java 백엔드 면접 마스터 플레이북 — 김병태
    • [초안] NSC 슬롯팀 경험 기반 질문 은행 — 도메인 모델링·동시성·성능·AI 협업
  • java 페이지로 이동
    • concurrency 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • 더_자바_코드를_조작하는_다양한_방법 페이지로 이동
    • [초안] Java 동시성 락 정리 — 커머스 메뉴/프로모션 정책 캐시 갱신 관점
    • [초안] JVM 튜닝 실전: 메모리 구조부터 Virtual Threads, GC 튜닝, 프로파일링까지
    • Java의 로깅 환경
    • MDC (Mapped Diagnostic Context)
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node 백엔드 운영 패턴 — Streams 백프레셔, pipe/pipeline, 멱등성 vs 분산 락
    • Node.js
    • npm vs pnpm — 어떤 기준으로 선택했나
    • `setImmediate()`
  • kafka 페이지로 이동
    • [초안] Kafka 기본 개념 — 토픽, 파티션, 오프셋, 복제
    • Kafka를 사용하여 **데이터 정합성**은 어떻게 유지해야 할까?
    • [초안] Kafka 실전 설계: 파티션 전략, 컨슈머 그룹, 전달 보장, 재시도, 순서 보장 트레이드오프
    • 메시지 전송 신뢰성
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • tmux — Terminal Multiplexer
  • network 페이지로 이동
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • rabbitmq 페이지로 이동
    • [초안] RabbitMQ Basics — 실전 백엔드 관점에서 정리하는 메시지 브로커 기본기
    • [초안] RabbitMQ vs Kafka — 백엔드 메시징 선택 기준과 실전 운영 관점
  • security 페이지로 이동
    • [초안] 시니어 백엔드를 위한 보안 / 인증 스터디 팩 — Spring Security, JWT, OAuth2, OWASP Top 10
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • sb-dev-team 페이지로 이동
    • the-future-company 페이지로 이동
  • testing 페이지로 이동
    • [초안] 시니어 Java 백엔드를 위한 테스트 전략 완전 정리 — 피라미드부터 TestContainers, 마이크로벤치, Contract까지
  • travel 페이지로 이동
    • 오사카 3박 4일 일정표: 우메다 쇼핑, USJ, 난바·도톤보리, 오사카성
  • web 페이지로 이동
    • [초안] HTTP / Cookie / Session / Token 인증 기본기 — 레거시 JSP와 모바일 API가 공존하는 백엔드 관점
FOS-BLOG · FOOTERall systems normal·v0.1 · 2026.04.27·seoul, kr
Ffos-blog/study

개발 학습 기록을 정리하는 블로그입니다. 공부하면서 기록하고, 기록하면서 다시 배웁니다.

visitors
01site
  • Home↗
  • Posts↗
  • Categories↗
  • About↗
02policy
  • 소개/about
  • 개인정보처리방침/privacy
  • 연락처/contact
03categories
  • AI↗
  • Algorithm↗
  • DB↗
  • DevOps↗
  • Java/Spring↗
  • JS/TS↗
  • React↗
  • Next.js↗
  • System↗
04connect
  • GitHub@jon890↗
  • Source repositoryjon890/fos-study↗
  • RSS feed/rss.xml↗
  • Newsletter매주 1 회 · 한 편의 글→
© 2026 FOS Study. All posts MIT-licensed.
built with·Next.js·Tailwind v4·Geist·Pretendard·oklch
fos-blog/database/[초안] MySQL / InnoDB 인덱스 …
db

[초안] MySQL / InnoDB 인덱스 허브

MySQL/InnoDB 인덱스는 면접과 실무 모두에서 "어떻게 동작하는가(구조)"와 "왜 내 쿼리는 느린가(운영)" 두 축으로 반복해서 등장한다. 이 문서는 인덱스 종합 허브로서 각 축의 핵심만 짧게 정리하고, 심화는 아래 상세 문서로 내려가게 한다. - 저장 구조 · 버퍼 풀 · MVCC 같은 엔진 내부는 → InnoDB 스토리지 엔진 아키텍처 - 복합...

2026.03.24·9 min read·74 views

이 문서의 역할

MySQL/InnoDB 인덱스는 면접과 실무 모두에서 "어떻게 동작하는가(구조)"와 "왜 내 쿼리는 느린가(운영)" 두 축으로 반복해서 등장한다. 이 문서는 인덱스 종합 허브로서 각 축의 핵심만 짧게 정리하고, 심화는 아래 상세 문서로 내려가게 한다.

  • 저장 구조 · 버퍼 풀 · MVCC 같은 엔진 내부는 → InnoDB 스토리지 엔진 아키텍처
  • 복합 인덱스 컬럼 순서, 커버링 설계 심화는 → 복합 인덱스 완전 정복
  • EXPLAIN / EXPLAIN ANALYZE로 실행 계획을 실제로 진단하는 법은 → EXPLAIN 실행 계획 읽기

이 허브에서는 "개념 한 번, 링크 한 번" 원칙으로 같은 설명을 반복하지 않는다.


1. InnoDB 인덱스의 핵심 사실 4가지

면접에서 바로 꺼낼 수 있어야 하는 최소 지식.

  1. 모든 InnoDB 인덱스는 B+Tree다. 리프에만 값이 있고 리프끼리 양방향 링크드 리스트로 연결되어 범위 검색에 유리하다. 노드 하나가 16KB 페이지에 다수 키를 담아 트리 높이가 3~4단계에 머문다.
  2. PK 자체가 테이블이다(클러스터드 인덱스). PK 리프 노드에 실제 row가 통째로 저장된다. 별도의 "테이블 파일 + 인덱스 파일" 구조가 아니다.
  3. 세컨더리 인덱스 리프에는 PK 값이 들어있다. 그래서 세컨더리 인덱스로 조회하면 기본적으로 두 번 탐색한다(세컨더리 → PK 트리). 이걸 북마크 룩업이라 부른다.
  4. 커버링 인덱스가 되면 북마크 룩업이 사라진다. SELECT에 필요한 모든 컬럼이 인덱스 안에 있으면 테이블 본문에 접근하지 않는다. EXPLAIN Extra: Using index로 확인.

페이지 구조, 버퍼 풀, 리두/언두 같은 엔진 내부 동작은 innodb-storage-architecture.md에서 다룬다.


2. 인덱스 종류와 선택 기준

종류정의언제 쓰나
클러스터드 인덱스(PK)리프에 실제 row. 테이블당 1개모든 InnoDB 테이블에 필수. 단조 증가 + 불변 + 짧게
세컨더리 인덱스리프에 (키, PK). 테이블당 N개WHERE/JOIN/ORDER BY에서 자주 쓰이는 컬럼
복합 인덱스여러 컬럼을 한 키로조건이 2개 이상인 쿼리. 좌측 접두사 규칙 준수
커버링 인덱스SELECT 전 컬럼이 인덱스에 존재고빈도·컬럼 고정 조회. 쓰기 비용 트레이드오프
유니크 인덱스값 중복 금지비즈니스 유일성 보장. 옵티마이저에 const/eq_ref 힌트
FULLTEXT역색인 기반 텍스트 검색LIKE '%키워드%' 대체. 본격 검색은 Elasticsearch 고려

PK 선택의 3원칙

  • 불변: PK가 바뀌면 모든 세컨더리 인덱스 리프가 바뀐다.
  • 짧게: 세컨더리 인덱스 리프에 PK가 복제되므로 PK가 길면 모든 인덱스가 비대해진다.
  • 단조 증가: AUTO_INCREMENT 또는 UUIDv7/ULID. UUIDv4는 중간 삽입이 잦아 페이지 분할이 심하다.

3. 복합 인덱스 — 좌측 접두사 규칙만 기억하면 된다 (심화는 별도 문서)

INDEX idx (a, b, c)의 리프는 a → 같은 a 내 b → 같은 (a,b) 내 c 순서로 정렬된다. 이 물리 구조가 좌측 접두사 규칙의 근거다.

쿼리 조건사용비고
a = ?a선두 컬럼
a = ? AND b = ?a, b좌측부터 연속
a = ? AND b = ? AND c = ?a, b, c모두 사용
b = ? AND c = ?미사용선두 컬럼 없음
a = ? AND c = ?a만b 건너뜀 → c는 인덱스 활용 X
a = ? AND b > ? AND c = ?a, b까지범위 이후 컬럼은 인덱스 활용 X

컬럼 순서 4원칙 (요약)

  1. 동등(=) 조건 컬럼을 앞에
  2. 동등 조건이 여럿이면 그 중 선택도 높은 것을 앞에
  3. 범위(>, <, BETWEEN) 컬럼을 뒤에
  4. ORDER BY / GROUP BY 컬럼을 범위 뒤에 (filesort 회피)

선택도만 보고 순서를 정하는 건 흔한 오답이다. 쿼리 패턴이 우선. 근거, 실습, 실패 사례, EXPLAIN key_len 역산법 등은 composite-index.md 참고.


4. EXPLAIN으로 검증한다 — 만들기보다 확인하기 (심화는 별도 문서)

인덱스를 "만들었다"로 끝내면 안 된다. EXPLAIN으로 실제로 타는지 확인하는 습관이 실력이다.

4-1. 첫눈에 봐야 할 컬럼

컬럼본다는 의미
typeconst/eq_ref/ref/range 좋음, index 나쁨, ALL 풀스캔
key실제 선택된 인덱스
key_len인덱스 바이트 수 → 몇 컬럼 사용했는지 역산 가능
rows × filtered/100다음 단계로 넘어갈 예상 행 수
ExtraUsing index(커버링), Using filesort(정렬 인덱스 미사용), Using index condition(ICP)

4-2. 최소 진단 절차

  1. EXPLAIN → type이 ALL/index인지, key가 기대한 인덱스인지, key_len이 기대한 컬럼 수만큼인지 확인
  2. Extra에 Using filesort / Using temporary가 있으면 설계 재검토
  3. 예측과 실제가 다르면 EXPLAIN ANALYZE + ANALYZE TABLE로 통계 갱신
  4. 수정 후 다시 EXPLAIN으로 실제로 바뀌었는지 검증

key_len 역산 공식, EXPLAIN ANALYZE 트리 읽기, JPA N+1 vs JOIN FETCH EXPLAIN 비교, Aurora Reader 라우팅 영향은 explain-plan.md 참고.


5. 인덱스를 "안 타는" 대표 안티패턴 12가지 (한 줄 요약)

실무 슬로우 쿼리의 상당수가 여기에 해당한다. 각 케이스의 상세 재현·수정·EXPLAIN 검증은 explain-plan.md 7장을 참고한다.

  1. 컬럼에 함수/연산 — WHERE YEAR(created_at) = 2025 → 범위 조건으로 변환하거나 함수형 인덱스
  2. 암묵적 타입 변환 — WHERE user_id = '42', VARCHAR 컬럼을 숫자와 비교 → 파라미터 타입을 컬럼 타입과 일치
  3. LIKE 선두 와일드카드 — LIKE '%kim' → FULLTEXT / 외부 검색 엔진 / REVERSE 함수형 인덱스
  4. OR 조건 — WHERE a = ? OR b = ? → UNION ALL로 분해
  5. 낮은 카디널리티 + 넓은 매칭 — WHERE status = 'ACTIVE'가 80% → 단독 인덱스 지양, 복합 인덱스 뒷부분에 포함
  6. 좌측 접두사 규칙 위반 — (a,b,c)에 WHERE b = ? → 새 인덱스 or 컬럼 순서 재설계
  7. 범위 조건 이후 컬럼 — (a,b,c)에 a = ? AND b > ? AND c = ? → 동등 컬럼을 앞으로 ((a,c,b))
  8. ORDER BY 미스매치 — Using filesort → 정렬 컬럼을 인덱스 뒷부분에 포함, 필요하면 내림차순 인덱스
  9. 옵티마이저 풀스캔 선택 — 통계 낡음, 매칭 비율 과다, 테이블 작음 → ANALYZE TABLE 우선, FORCE INDEX는 최후
  10. !=, NOT IN, <> — 범위 표현 곤란 → 가능하면 긍정 조건(IN (...)) 으로 재작성
  11. NULL 비교 실수 — column = NULL은 틀린 문법. IS NULL은 인덱스 탈 수 있으나 선택도 극단 시 풀스캔
  12. SELECT * — 커버링 인덱스 불가, 버퍼 풀 낭비 → 필요 컬럼만 명시

6. 슬로우 쿼리 진단 플레이북 (면접 답변용)

"인덱스 걸었는데도 느립니다, 어떻게 보세요?"에 바로 쓸 수 있는 흐름.

  1. 슬로우 쿼리 로그 / APM에서 대상 쿼리 식별
  2. EXPLAIN: type, key, key_len, Extra 확인
  3. EXPLAIN ANALYZE로 예측 vs 실제 비교 → 차이 크면 ANALYZE TABLE
  4. 5장 안티패턴 중 어디에 해당하는지 분류
  5. 조치 순서 — 쿼리 재작성 → 인덱스 추가 → 인덱스 재설계 (가벼운 것부터)
  6. 수정 후 다시 EXPLAIN으로 실제 변화 검증
  7. 운영 반영 시 온라인 DDL 가능 여부 확인 (ALGORITHM=INPLACE, LOCK=NONE), Aurora Reader 지연 모니터링
  8. 반영 후 슬로우 쿼리 로그 / p99 재측정

7. 운영 관점에서 반드시 아는 포인트

  • 페이지 분할/단편화: 랜덤 PK, 중간 UPDATE가 많으면 페이지 분할이 잦아진다. 범위 스캔 시 순차 I/O가 랜덤 I/O에 가까워진다. OPTIMIZE TABLE 가능하지만 락/복제 지연 주의.
  • 인덱스는 공짜가 아니다: INSERT/UPDATE/DELETE마다 모든 인덱스를 갱신한다. 버퍼 풀도 점유한다. "일단 만들어두자"가 아니라 쿼리 패턴 근거로 최소한만.
  • 통계 갱신: 대량 적재/삭제 후 ANALYZE TABLE을 의식적으로 호출한다. 통계가 낡으면 옵티마이저가 잘못된 플랜을 고른다.
  • 온라인 DDL: 대형 테이블 인덱스 생성은 수십 분~수 시간. ALGORITHM=INPLACE, LOCK=NONE 확인, 필요 시 pt-online-schema-change / gh-ost.

버퍼 풀 크기, 더티 페이지 플러시, 체크포인트 에이지, 리두 로그 연관 동작은 innodb-storage-architecture.md에서 다룬다.


8. 면접 답변 프레임

Q1. "MySQL 인덱스는 어떤 구조고 왜 빠른가요?"

"InnoDB는 B+Tree를 씁니다. 리프에만 값이 있고 리프끼리 양방향 링크로 연결돼 범위 검색이 효율적이고, 16KB 페이지에 키를 많이 담아 트리 높이가 3~4단계로 낮아 100만 행에서도 PK 조회가 디스크 I/O 몇 번으로 끝납니다. InnoDB는 PK 자체가 테이블 구조(클러스터드 인덱스)이고, 세컨더리 인덱스는 리프에 PK를 담아 두 번 탐색으로 행을 읽습니다. 필요한 컬럼이 모두 인덱스에 있으면 이 두 번째 탐색이 사라지는데, 이걸 커버링 인덱스라 하고 EXPLAIN Extra: Using index로 확인합니다."

Q2. "인덱스를 걸었는데도 느린 쿼리, 어떻게 진단하시나요?"

"EXPLAIN부터 봅니다. type이 ALL/index인지, key가 의도한 인덱스인지, key_len이 기대한 컬럼 수만큼인지, Extra에 Using filesort/Using temporary가 있는지 확인합니다. 원인은 패턴이 정해져 있어서 — 컬럼에 함수/연산, 암묵적 타입 변환, LIKE 선두 와일드카드, OR 분기, 좌측 접두사 위반, 범위 조건 뒤 동등 조건 등 — 분류한 뒤 쿼리 재작성 → 인덱스 추가 → 인덱스 재설계 순으로 가벼운 조치부터 시도하고, 수정 후 반드시 EXPLAIN으로 재검증합니다."

Q3. "복합 인덱스 컬럼 순서는 어떻게 정하나요?"

"쿼리 패턴이 우선이고 선택도는 그 다음입니다. 동등 조건 컬럼을 앞에, 범위 조건을 뒤에, ORDER BY 컬럼을 마지막에 둡니다. 범위 이후 컬럼은 인덱스 연속성이 깨져 활용이 안 되기 때문입니다. 설계 후 EXPLAIN key_len으로 의도한 컬럼 수만큼 잡히는지 확인합니다. 심화 기준과 실제 설계 예시는 별도로 정리해뒀습니다."

Q4. "커버링 인덱스는 언제 쓰나요?"

"읽기 빈도가 매우 높고 SELECT 컬럼이 고정된 핫 쿼리에 선별 적용합니다. 세컨더리 인덱스 리프에 PK가 있으니 SELECT 대상이 모두 인덱스 안에 있으면 클러스터드 인덱스 재조회(랜덤 I/O)가 사라집니다. 다만 인덱스가 비대해지고 쓰기 비용이 늘어나므로 모든 조회에 적용하지는 않습니다."


9. 체크리스트

  • EXPLAIN type이 ALL/index가 아닌가
  • key가 의도한 인덱스인가
  • key_len이 기대한 컬럼 수만큼인가
  • Extra에 Using filesort / Using temporary가 없는가 (있다면 그래야만 하는 이유가 있는가)
  • 인덱스 컬럼에 함수/연산이 없는가
  • 파라미터 타입이 컬럼 타입과 일치하는가 (JPA 바인딩 포함)
  • LIKE에 선두 와일드카드가 없는가
  • OR을 UNION ALL로 쪼갤 수 있는가
  • 복합 인덱스 좌측 접두사를 지키는가
  • 범위 조건 뒤에 또 다른 동등 조건을 두지 않았는가
  • ORDER BY 컬럼이 인덱스 뒷부분에 포함되는가
  • ANALYZE TABLE로 통계가 최신인가
  • 인덱스 개수가 쓰기 부하에 비례해 과하지 않은가
  • 운영 반영 시 온라인 DDL 가능한가

관련 문서

  • InnoDB 스토리지 엔진 아키텍처 — 저장 구조 · 버퍼 풀 · MVCC 허브
  • 복합 인덱스 완전 정복 — 좌측 접두사 · 선택도 · 커버링 설계 심화
  • EXPLAIN / EXPLAIN ANALYZE — 실행 계획 읽기와 실전 진단
  • InnoDB 트랜잭션과 잠금 (MVCC · Lock)
  • Redo Log
on this page
  • 01이 문서의 역할
  • 021. InnoDB 인덱스의 핵심 사실 4가지
  • 032. 인덱스 종류와 선택 기준
  • PK 선택의 3원칙
  • 043. 복합 인덱스 — 좌측 접두사 규칙만 기억하면 된다 (심화는 별도 문서)
  • 컬럼 순서 4원칙 (요약)
  • 054. EXPLAIN으로 검증한다 — 만들기보다 확인하기 (심화는 별도 문서)
  • 4-1. 첫눈에 봐야 할 컬럼
  • 4-2. 최소 진단 절차
  • 065. 인덱스를 "안 타는" 대표 안티패턴 12가지 (한 줄 요약)
  • 076. 슬로우 쿼리 진단 플레이북 (면접 답변용)
  • 087. 운영 관점에서 반드시 아는 포인트
  • 098. 면접 답변 프레임
  • Q1. "MySQL 인덱스는 어떤 구조고 왜 빠른가요?"
  • Q2. "인덱스를 걸었는데도 느린 쿼리, 어떻게 진단하시나요?"
  • Q3. "복합 인덱스 컬럼 순서는 어떻게 정하나요?"
  • Q4. "커버링 인덱스는 언제 쓰나요?"
  • 109. 체크리스트
  • 11관련 문서

댓글 (0)