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

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

데
데이터베이스초보
조회 2291댓글 4

MySQL 테이블에 데이터가 10만건 넘으니 SELECT가 느려졌습니다. 인덱스를 걸라고 하는데, 모든 컬럼에 걸어도 되나요? 어떤 기준으로 인덱스를 만들어야 하나요?

댓글 4

김김영삼8년 전

인덱스는 WHERE, JOIN, ORDER BY에 자주 쓰이는 컬럼에 걸어야 합니다.

인덱스 걸어야 할 때
  • WHERE 조건에 자주 사용되는 컬럼
  • JOIN의 ON 조건 컬럼
  • ORDER BY 컬럼 (정렬 속도 향상)
인덱스 걸면 안 되는 경우
  • 데이터가 적은 테이블 (1000건 이하)
  • INSERT/UPDATE가 매우 빈번한 컬럼
  • 값의 종류가 적은 컬럼 (성별 같은 boolean형)
-- EXPLAIN으로 쿼리 분석
EXPLAIN SELECT * FROM users WHERE email = "test@test.com";

-- 인덱스 추가
ALTER TABLE users ADD INDEX idx_email (email);

-- 복합 인덱스 (자주 함께 쓰는 컬럼)
ALTER TABLE orders ADD INDEX idx_user_date (user_id, created_at);
데데이터베이스초보(guest)8년 전
EXPLAIN 써보니 type이 ALL이었는데 인덱스 추가 후 ref로 바뀌었어요. 쿼리가 5초에서 0.01초로 줄었습니다!
김김영삼8년 전
추가로 복합 인덱스에서 컬럼 순서가 중요합니다. WHERE에서 먼저 필터링하는 컬럼을 앞에 두세요. (user_id, created_at) 순으로 만들면 user_id만으로도 인덱스를 활용합니다.
데데이터베이스초보(guest)8년 전
컬럼 순서까지! 정말 도움 많이 됐습니다. 감사합니다!
Ctrl+Enter로 등록