[MySQL] Index

조애옹·2025년 6월 11일

🔍 인덱스(Index)란?

  • 데이터베이스에서 검색 속도를 높이기 위해 사용하는 부가적인 데이터 구조
  • 인덱스는 특정 컬럼을 기준으로 생성됨
  • 테이블 전체를 스캔하지 않고, 인덱스를 통해 빠르게 검색할 수 있음
  • 인덱스 구조는 정렬되어 저장되므로, 이진 탐색을 통한 빠른 검색이 가능함

✅ 인덱스의 종류

인덱스 종류설명
PRIMARY KEY유일값 + 클러스터형 인덱스 (가장 빠름)
기본 키이며 NULL 불가
UNIQUE KEY유일값 보장 + 비클러스터형 인덱스
NORMAL KEY중복 허용 일반 인덱스 (가장 일반적인 형태)
FULLTEXT INDEX본문 검색용 인덱스
※ MySQL 기본은 한글 미지원 (영문 위주)
※ 한글은 mroonga 플러그인 설치 필요

✅ 클러스터형 vs 비클러스터형

항목클러스터형 인덱스 (Primary Key)비클러스터형 인덱스 (나머지)
저장 위치인덱스와 row가 함께 저장됨인덱스는 별도로, row는 포인터 따라 조회
조회 성능더 빠름다소 느릴 수 있음
인덱스 종류단 하나만 가능 (PK)여러 개 생성 가능

✅ 인덱스 동작 순서 예시

SELECT * FROM quotes WHERE id = 500;
  1. 옵티마이저가 실행 계획을 수립
  2. id에 인덱스 없으면 → 풀 테이블 스캔
  3. id에 인덱스 있으면 → 이진 탐색 후 포인터 따라 row 조회
  4. 클러스터형 인덱스면 → 바로 row 도달

✅ 인덱스의 특징

장점

  • SELECT 속도 향상
  • WHERE, JOIN, ORDER BY, GROUP BY 최적화

단점

  • INSERT / UPDATE / DELETE 성능 저하
  • 저장 공간 증가
  • 인덱스가 많아질수록 오히려 성능 저하 가능

✅ EXPLAIN 명령어로 실행 계획 확인

EXPLAIN SELECT * FROM quotes WHERE id = 500;
  • EXPLAIN을 붙이면 해당 SQL이 실제로 어떻게 실행되는지 확인 가능
  • 사용된 인덱스, 접근 방식(type), 비용(rows), 정렬 방식 등 확인 가능
  • 튜닝 포인트 찾기에 매우 유용

✅ DELETE vs TRUNCATE

항목DELETETRUNCATE
대상조건 지정 가능전체 테이블만 가능
트랜잭션 지원OX (롤백 불가)
인덱스 유지 여부유지됨모두 삭제됨
AUTO_INCREMENT유지됨초기화됨 (다시 1부터 시작)
속도느림빠름

💡 TIPS

  • SLOW QUERY LOG: 실행 시간이 오래 걸리는 쿼리를 기록해 성능 병목을 찾아내고 쿼리 튜닝에 활용하는 기능
profile
아자잣

0개의 댓글