본문 바로가기
Q&A해결2018년 3월 5일1분 읽기

MySQL 인덱스를 언제 걸어야 하나요

데
데이터베이스초보
조회 2322댓글 5
MySQL 테이블에 데이터가 10만건 정도 있는데 SELECT 쿼리가 느립니다. 인덱스를 걸면 빨라진다고 하는데, 모든 컬럼에 인덱스를 걸면 되나요? 인덱스의 원리와 언제 걸어야 하는지 알려주세요. EXPLAIN으로 확인해보니 type이 ALL로 나옵니다.

댓글 5

김김영삼8년 전
인덱스는 책의 색인과 같습니다. 모든 컬럼에 거는 것은 오히려 성능을 떨어뜨립니다.

**인덱스를 걸어야 하는 경우:**
- WHERE 절에 자주 사용되는 컬럼
- JOIN 조건에 사용되는 컬럼
- ORDER BY에 사용되는 컬럼
- 카디널리티(고유값)가 높은 컬럼

**인덱스를 피해야 하는 경우:**
- INSERT/UPDATE/DELETE가 빈번한 테이블
- 데이터가 적은 테이블
- 카디널리티가 낮은 컬럼 (성별 등)

```sql
-- 인덱스 생성
ALTER TABLE users ADD INDEX idx_email (email);
-- 복합 인덱스
ALTER TABLE orders ADD INDEX idx_user_date (user_id, created_at);
```

EXPLAIN에서 type이 ALL이면 풀 테이블 스캔입니다. 인덱스를 걸면 ref나 range로 바뀌어야 합니다.
서서버지기영호8년 전
복합 인덱스를 사용할 때 컬럼 순서가 중요합니다. WHERE에서 첫 번째 컬럼을 사용하지 않으면 인덱스가 안 탑니다.
데데이터베이스초보(guest)서버지기영호8년 전
아 복합 인덱스 순서까지 신경써야 하는군요. 좌측 컬럼부터 매칭된다는 거죠?
서서버지기영호서버지기영호8년 전
네 맞습니다. 이걸 "최좌선 접두사 규칙"이라고 합니다.
데데이터베이스초보(guest)8년 전
WHERE절에 자주 쓰는 컬럼에 인덱스 걸었더니 쿼리 시간이 2초에서 0.01초로 줄었습니다! 감사합니다.
Ctrl+Enter로 등록