MySQL 테이블에 데이터가 10만건 정도 있는데 SELECT 쿼리가 느립니다. 인덱스를 걸면 빨라진다고 하는데, 모든 컬럼에 인덱스를 걸면 되나요? 인덱스의 원리와 언제 걸어야 하는지 알려주세요. EXPLAIN으로 확인해보니 type이 ALL로 나옵니다.
댓글 5
**인덱스를 걸어야 하는 경우:**
- 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로 바뀌어야 합니다.