출처 : http://blog.bongwork.com/archives/38
웹사이트가 느려지거나, 랙이 발생하게 되면 보통 DB를 모니터링합니다. 뭐 대부분 db 에서 문제가 발생하기 마련입니다.
slow 로그를 우선 모니터링 하게 되는데, 쿼리가 실행되는 페이지나 상황이 특정되는 경우는 쿼리를 튜닝하고, 해당 페이지의 서비스 코드(예를 들어 .php 파일)의 쿼리부분을 수정하면 쉽게 장애조치가 가능합니다.
그러나 웹페이지에서 쿼리에 변수 몇개를 바인드하여 사용하기 때문에, 쿼리로는 페이지나 상황을 특정하기 여러운 경우가 있습니다. 이런 경우에 사용할수 있는 간단한 팁입니다.
MySQL은 쿼리에 주석을 추가할수 있는데, 주석에 페이지 정보나 라인을 추가합니다. (이해를 하기 쉽게 하기 위해 그누보드5를 기준으로 설명하겠습니다.)
최근 게시물이나 게시물 수를 표시하기 위해 아래와 같은 쿼리가 들어간 페이지가 있습니다.
$sql = “select count(*) from g5_board_new where ….. “;
$sql = “select * from g5_board new where …. limit 5… “;
해당 쿼리가 들어간 php 파일은 찾았는데 파일수가 20개 라면,어떤 php 가 호출될때가 문제인지를 찾아야 합니다.
이때 다음과 같이 쿼리문에 주석을 추가합니다.
$sql = “select /* “.$_SERVER[‘SCRIPT_NAME’].” */ from g5_board_new where … “;
$sql = “select /* “.$_SERVER[‘SCRIPT_NAME’].” */ * from g5_board new where …. limit 5… “;
(주석 위치는 가능한 공간이면 아무곳에 넣어도 상관없습니다.)
이제 이렇게 소스를 수정한뒤에 슬로우 쿼리를 보면, 문제가 되는 페이지를 찾을수 있습니다. 쿼리 튜닝이 어려운 페이지인 경우에는 캐시 처리를 하면 끝.
추가
- function shortPosition($file, $line) {
return substr($file, strlen($_SERVER['HOME'])).' : '.$line;
}
$query .= '/* '.shortPosition(__FILE__, __LINE__).' */'; 요렇게 하면 보기 좋을 것 같네요.
'프로그램개발 > DB(MySQL,MariaDB,MongoDB)' 카테고리의 다른 글
MySQL, MariaDB JSON 지원 (0) | 2018.01.11 |
---|---|
MySQL DB-Link 구현을 위한 FEDERATED 엔진 활성화 및 테이블 생성 (0) | 2018.01.05 |
Table '테이블명' is marked as crashed and should be repaired. (0) | 2017.10.31 |
mysql, mariadb에서 SHOW PROFILE 사용? (0) | 2017.10.27 |
[MySQL] 피벗 - 로우 데이터를 컬럼으로 옮기기 (0) | 2017.10.25 |