1. Optimizing Quires with EXPLAIN
가. EXPLAIN
1) 정의
•
특정 쿼리에 대한 옵티마이저의 실행계획 확인
2) 특징
•
하나의 쿼리 앞에 EXPLAIN 키워드를 붙여서 사용함
•
특정 쿼리의 성능을 확인할 수 있음
→ 같은 결과를 얻을 수 있는 복수의 쿼리에 대한 성능 비교 가능
나. know-how
1) 세로 보기
•
\G 활용하여 EXPLAIN의 결과를 세로로 볼 수 있음
→ EXPLAIN SELECT a FROM user \G
2. EXPLAIN Output Format
가. select_type
DEPENDENT SUBQUERY or DERIVED를 확인하면 join을 활용하여 바뀌도록 시도할 것
1) select type
•
SELECT 쿼리문의 타입
2) SIMPLE, PRIMARY
•
simple: 간단한 select
→ UNION이나 서브쿼리 미사용
•
primary: 가장 바깥 쿼리
3) SUBQUERY
•
일반적인 서브쿼리
EXPLAIN
SELECT * FROM USER
WHERE ID IN
(SELECT SELLER FROM TRADE
GROUP BY SELLER
HAVING COUNT(*) > 3);
SQL
복사
4) DERIVED
•
FROM 구의 서브쿼리
EXPLAIN
SELECT * FROM
( SELECT * FROM user u) as u2;
SQL
복사
•
n+1에 준하는 성능
→ 제거할 수 없는 경우가 많지만 제거할 것을 권장
5) DEPENDANT SUBQUERY
•
바깥 쿼리의 테이블에 의존하는 서브쿼리
EXPLAIN
SELECT * FROM user u
WHERE money > ANY (
SELECT price FROM trade t WHERE u.id = t.seller );
SQL
복사
•
join으로 대체 가능하므로 제거 권장
나. type
INDEX or ALL을 확인하면 index를 생성하여 RANGE or REF로 바뀌도록 시도할 것
1) type
•
JOIN의 타입
2) SYSTEM, CONST
•
오버헤드가 거의 없음
•
system: 시스템 내부값
•
const: 오직 하나의 매칭되는 행이 존재
3) REF
•
??
•
모든 행이 특정 조건에 맞는 경우
4) RANGE
•
인덱스를 사용하여 특정 범위의 행을 추출
•
key column을 사용하여 비교연산을 하는 경우 RANGE 확인 가능
5) INDEX
•
index full scan
→ 인덱스에 대해서만 full scan
6) ALL
•
full scan
→ 인덱스와 실데이터 포함하여 full scan
다. 기타(Exra)
1) ID
•
SELECT에 대한 구분자
2) TABLE
•
특정 쿼리가 실행되는 테이블 이름
•
<derived2>: select_type(DERIVED) + id(2)
3) KEY
•
실제 적용된 인덱스의 이름
•
필요에 의해 생성한 인덱스가 제대로 사용되었는지 확인
4) ROWS
•
예상 레코드 개수
•
db 내부적으로 통계정보를 가지고 있어서 쿼리를 실행하지 않더라도 알 수 있음
3. 기타
가. 쿼리 튜닝 전 시도해봐야 하는 것
1) 네트워크 상태 확인
•
WAS와 DB 서버 간 네트워크 상태 확인
2) 서버 모니터링 / DBMS 모니터링 도구 사용
•
모니터링에 따른 개선사항 발견 시 조치 필요
3) 하드웨어 수직 확장
•
하드웨어 성능 부족에 따른 성능 저하가 아닌지 확인
나. 실습 데이터 생성
Reference
•
Optimizing Queries with EXPLAIN, https://dev.mysql.com/doc/refman/5.7/en/using-explain.html
•
EXPLAIN Output Format, https://dev.mysql.com/doc/refman/5.7/en/explain-output.html