DB

[MySQL] 인덱스란? 개념과 필요한 이유 완벽 정리 🧠

인생아 2025. 7. 3. 19:58
반응형

MySQL 인덱스(Index)는 데이터베이스 성능 최적화에서 빼놓을 수 없는 핵심 기능이다. 인덱스를 제대로 이해하고 활용하면 검색 속도 향상, 조회 최적화, 운영 효율까지 모두 잡을 수 있다.

🔍 인덱스란 무엇인가?

인덱스(Index)책의 목차처럼, 원하는 데이터를 빠르게 찾을 수 있도록 도와주는 데이터 구조다.

MySQL에서 인덱스는 내부적으로 B-TreeHash Table 구조로 구현되며, 테이블 내 특정 컬럼에 대한 빠른 검색, 정렬, 그룹화, 조인 성능을 향상시켜준다.

예를 들어 아래와 같은 쿼리가 있다고 하자.

SELECT * FROM users WHERE email = 'test@example.com';

email 컬럼에 인덱스가 없다면, MySQL은 전체 테이블을 스캔(Full Table Scan) 해야 한다. 반면, 인덱스가 있다면 몇 건만 탐색해서 결과를 바로 찾는다.

반응형

⚡ 인덱스가 필요한 이유

1️⃣ 쿼리 성능 개선

인덱스를 통해 검색 시간은 O(n)에서 O(log n) 수준으로 줄어든다. 특히 대용량 테이블에서 수십 배 이상의 성능 차이가 발생할 수 있다.

2️⃣ WHERE 조건 최적화

SELECT * FROM orders WHERE status = 'COMPLETED';

status 컬럼에 인덱스를 걸면 조건 필터링이 훨씬 빨라진다.

3️⃣ JOIN 성능 향상

SELECT *
FROM orders o
JOIN customers c ON o.customer_id = c.id;

customer_id 또는 id에 인덱스가 없다면 조인 자체가 느려지고, 성능 병목이 발생할 수 있다.

4️⃣ ORDER BY / GROUP BY 가속화

정렬이나 그룹핑에도 인덱스가 큰 역할을 한다. 아래 쿼리의 경우도 마찬가지다.

SELECT category, COUNT(*) 
FROM products 
GROUP BY category 
ORDER BY category;

category 컬럼에 인덱스가 있다면 정렬과 그룹핑 모두 빨라진다.

🧱 인덱스의 동작 방식 (B-Tree 중심)

MySQL의 기본 인덱스는 B-Tree 기반이다. 아래는 B-Tree 인덱스의 개념을 간단히 정리한 것이다.

  • 균형 잡힌 트리 구조로 빠른 검색을 지원한다.
  • 중간 노드가 루트로부터 리프까지 동일 거리에 있어 효율적이다.
  • 범위 검색에 최적화되어 있다.

예제

CREATE INDEX idx_name ON users(name);
SELECT * FROM users WHERE name LIKE 'Cha%';

위 쿼리는 인덱스를 통해 'Cha'로 시작하는 이름들을 빠르게 찾는다.

⚠️ 인덱스 사용 시 주의사항

인덱스가 많다고 항상 좋은 건 아니다. 아래와 같은 경우는 오히려 성능 저하를 일으킬 수 있다.

  • INSERT/UPDATE 성능 저하: 인덱스는 유지 비용이 있다.
  • 불필요한 인덱스 남발은 디스크 낭비 + 최적화 실패
  • 함수 기반 검색은 인덱스가 무시될 수 있음
    예: WHERE YEAR(created_at) = 2024 → 인덱스 미사용 가능
반응형

🛠️ 인덱스 여부 확인: EXPLAIN 활용

EXPLAIN SELECT * FROM users WHERE name = '홍길동';

key, possible_keys, rows 항목을 통해 인덱스 사용 여부와 효과를 분석할 수 있다.

💡 인덱스가 효과적인 경우 vs 비효과적인 경우

구분 인덱스 사용 시 효과적인 경우 인덱스가 비효율적인 경우
WHERE 등호 조건, 범위 검색 함수 사용, 데이터 분포 불균형
ORDER BY 정렬 컬럼에 인덱스 있을 때 복잡한 정렬 조건
JOIN 조인 키에 인덱스 있을 때 조인 조건에 함수 또는 변형 사용
INSERT 인덱스 적을수록 유리 인덱스 많을수록 느림

📌 정리

  • 인덱스는 데이터 접근을 빠르게 해주는 필수적인 기능이다.
  • 실무에서는 필요한 컬럼만 적절히 인덱싱해야 한다.
  • EXPLAIN, 실행계획, 쿼리 로그를 통해 인덱스 효과를 분석하고 조정해야 한다.

🔗 참고한 공식 가이드

MySQL 공식 문서: https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html

반응형