본문 바로가기
Q&A2018년 6월 22일1분 읽기

MySQL 쿼리가 너무 느립니다 — EXPLAIN 분석법

개
개발자준호
조회 2699댓글 4
테이블에 약 50만 건 데이터가 있는데 조회 쿼리가 5초 이상 걸립니다. ```sql SELECT * FROM orders WHERE status = 'pending' AND created_at > '2018-01-01' ORDER BY created_at DESC LIMIT 20; ``` EXPLAIN을 돌려보면 type이 ALL로 나옵니다. 인덱스를 어떻게 걸어야 하나요?

댓글 4

김김영삼8년 전
type=ALL은 풀테이블 스캔입니다. 복합 인덱스를 만드세요.

```sql
ALTER TABLE orders ADD INDEX idx_status_created (status, created_at);
```

WHERE 조건에 자주 쓰이는 컬럼 순서대로 복합 인덱스를 걸면 됩니다. status가 카디널리티가 낮으니 앞에, created_at이 범위 조건이니 뒤에 놓는 게 좋습니다.
개개발자준호김영삼8년 전
오 인덱스 걸고 나니까 0.01초로 줄었습니다! EXPLAIN에서 type이 ref로 바뀌었어요. 감사합니다.
데데이터사이언스현김영삼8년 전
추가로 SELECT *는 피하시고 필요한 컬럼만 지정하면 더 빨라집니다.
서서버지기영호8년 전
참고로 `slow_query_log`를 활성화하면 느린 쿼리를 자동으로 기록할 수 있습니다. 운영 서버에서 필수입니다.
Ctrl+Enter로 등록