MySQL- 실행 계획 분석 시 주의사항
1. Select_type 칼럼의 주의 대상
1. DERIVED
DERIVED 는 FROM 절에 사용된 서브 쿼리로부터 발생한 임시 테이블을 의미
임시 테이블은 메모리에 저장될 수도 있고 디스크에 저장될 수 도 있다.
일반적으로 메모리에 저장하는 경우에는 크게 성능에 영향을 미치지 않지만, 데이터의 크기가 커서 임시 테이블을 디스크에 저장하면 성능이 떨어진다.
2. UNCACHEABLE SUBQUERY
쿼리의 FROM 절 이외의 부분에서 사용하는 서브쿼리는 가능하면 MySQL 옵티마이저가 최대한 캐시되어 재사용 될 수 있게 유도한다. 하지만 사용자 변수나 일부 함수가 사용된 경우에는 이러한 캐시 기능을 사용할 수 없게 만든다.
이런 실행 계획이 사용된다면 혹시 사용자 변수를 제거하거나 다른 함수로 대체해서 사용 가능할지 검토해보는 것이 좋다.
3. DEPENDENT SUBQUERY
쿼리의 FROM 절 이외의 사용하는 서브 쿼리가 자체적으로 실행되지 못하고, 외부 쿼리에서 값을 전달받아 실행되는 경우 DEPENDENT SUBQUERY 가 표시된다. 이는 서브 쿼리가 먼저 실행되지 못하고, 서브 쿼리가 외부 쿼리의 결과 값에 의존적이기 때문에 전체 쿼리의 성능을 느리게 만든다.
2. Type 칼럼의 주의 대상
ALL INDEX
INDEX 인덱스 풀 스캔을 의미하며, ALL 은 풀 테이블 스캔을 의미
3. KEY 칼럼의 주의 대상
쿼리가 인덱스를 사용하지 못할 때 실행 계획의 Key 칼럼에 아무 값도 표시되지 않는다.
쿼리가 인덱스를 사용할 수 있게 인덱스를 추가하거나 WHERE 조건을 변경하는것이 좋다.
4. Rows 칼럼의 주의 대상
쿼리가 실제 가져오는 레코드 수보다 훨씬 더 큰 값이 Rows 칼럼에 표시되는 경우에는 쿼리가 인덱스를 정상적으로
사용하고 있는지, 그리고 그 인덱스가 충분히 작업 범위를 좁혀 줄 수 있는 칼럼으로 구성됐는지 검토
5. Extra 칼럼의 주의 대상
쿼리가 요건을 제대로 반영하고 있는지 확인해야 하는 경우
- Full scan on NULL key
- Impossible HAVING
- Impossible WHERE
- Impossible WHERE noticed after reading const tables
- No matching min/max row
- No matching row in const table
- Unique row not found
쿼리의 실행 계획이 좋지 않는 경우
- Range checked for each record
- Using filesort
- Using join buffer
- Using temporary
- Using where
쿼리의 실행 계획이 좋은 경우
- Distinct
- Using index
- Using index for group-by
Reference
Real Mysql