2014년 1월 24일 금요일

high_performance_mysql_3rd_edition 쿼리 정보 확인

SHOW PROFILE
SET profiling = 1;
하게 되면 모든 쿼리를 임시테이블에 저장

SHOW PROFILES;
에서 확인 가능

SHOW PROFILE FOR QUERY 1;
해당 쿼리가 어떻게 진행 되었는지 확인 할수 있다.


SET @query_id = 1;

SELECT
STATE
, SUM(DURATION) AS Total_R
, ROUND(100 * SUM(DURATION) /(SELECT SUM(DURATION) FROM  INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = @query_id), 2) AS Pct_R
, COUNT(*) AS Calls
, SUM(DURATION) / COUNT(*) AS "R/Call"
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID = @query_id
GROUP BY STATE
ORDER BY Total_R DESC;

Sending data 튜닝 할수없음(조인, 서칭 등등)
Sorting result 어차피 얼마 안걸림



익스플렌 붙이고 쿼리 실행후 쇼워닝하면 실제로 실행된 쿼리를 볼 수 있음
EXPLAIN EXTENDED SELECT * FROM temp_tbl_user A, tbl_dragon B WHERE A.userIdx = B.userIdx LIMIT 0, 100;
SHOW WARNINGS;

SHOW STATUS
세션당 정보(쿼리총수 등)
대부분 튜닝에 필요 없는 정보

하지만 몇개의 TEMP 테이블이 만들어지는 지 알수 있슴
FLUSH STATUS;#세션 STATUS 초기화

SELECT * FROM gongdal_game1.gd_dat_game_user;

SHOW STATUS WHERE Variable_name LIKE 'Handler%'
OR Variable_name LIKE 'Created%';

EXPLAIN은 추측이지만 SHOW STATUS 실제로 일어난 일임

결과

#총3개의 TMEP를 만들었고 그중 2개는 디스크에 만듬 ->SHOW STATUS 가 임시 테이블을 하나 만들기때문에 총2개임
Created_tmp_disk_tables | 2 |
| Created_tmp_files | 0 |
| Created_tmp_tables | 3

#인덱스을 안탐
Handler_read_rnd_next | 6478 |

SHOW GLOBAL STATUS
전체 정보

Performance Schema
에서 정보를 구할수 도있지만 5.5에서는 그렇게 쓸모있지 않음

Diagnosing Intermittent Problems
복합적인 문제에서 이유를 모르겠으면 함부로 튜닝 하지말아
상황이 더 악화 될수도 있다
해결 조언
정확한 방법으로 진단하고 있는지
맞는 영역을 진단하고 있는지
디비외의 문제가 아닌지

만약에 클루가 있다면
싱글 쿼리 문제 인지 서버 전체 문제인지 확실이 해라
순간적으로 모든 쿼리가 느려지면 서버 문제다
서버는 잘도는대 하나의 쿼리만 느리면 쿼리 문제다

SMP system Symmetri  Multiprocessing(대칭 병렬 진행)
에서 예전 버전일수록 오류가 많다.
new 버전은 좀 덜하다

It also means that a lot of problems can be solved by simply upgrading MySQL


처리 조언
SHOW GLOBAL STATUS  를사용
를 1초에 한번씩 불러 문제가 생겼을때
Threads_running, Threads_connected, Questions 등을 봐라


mysqladmin ext -i1 | awk '
/Queries/{q=$4-qp;qp=$4}
/Threads_connected/{tc=$4}
/Threads_running/{printf "%5d %5d %5d\n", q, tc, $4}'


mysqladmin ext mysql의 글로벌 스테이터스를 출력
| awk 정규식 스크립트 언어
http://ko.wikipedia.org/wiki/AWK

보통 두가지 경우가 있는대
하나는 전에 실행된 쿼리 때문에 느려지는 경우
하나는 어플리케이션의 캐쉬 데이터가 만료되면서 엄청난 쿼리가 날라오는 경우

SHOW PROCESSLIST 를 사용
mysql -e 'SHOW PROCESSLIST\G' | grep State: | sort | uniq -c | sort -rn

Using query logging
슬로우 쿼리를 찍고 long_query_time = 0 으로 만들어 모든 쿼리를 찍는다.

갑자기 속도가 오래 걸리는 부분을 찾아서확인한다.

$ awk '/^# Time:/{print $3, $4, c;c=0}/^# User/{c++}' slow-query.log
어떤 시간에 무슨 일이 일어 났는지 확인 할수 있다

진단 방법
98P부터시작
1.방아쇠를