Search
💿

쿼리 튜닝 기초

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