php mysql 느린 쿼리는 상대적으로 느리게 실행되는 SQL 문을 로그에 기록하는 것을 의미합니다. 느린 쿼리 로그를 켜면 MySQL이 지정된 시간을 초과하는 쿼리를 기록하고 성능 병목 현상을 찾아 분석하여 데이터베이스를 더 잘 최적화할 수 있습니다. 시스템 성능.
이 글의 운영 환경: windows7 시스템, PHP7.1 버전, DELL G3 컴퓨터
php mysql 느린 쿼리란 무엇입니까?
MySQL 느린 쿼리는 느리게 실행되는 SQL 문을 로그에 기록합니다. 이 기능을 사용하려면 활성화해야 합니다.
1. 소개
느린 쿼리 로그를 활성화하면 MySQL이 지정된 시간을 초과하는 쿼리를 기록할 수 있으며, 성능 병목 현상을 찾아 분석하여 데이터베이스 시스템의 성능을 더 잘 최적화할 수 있습니다.
2. 파라미터 소개
slow_query_log 느린 쿼리 오픈 상태
slow_query_log_file 느린 쿼리 로그가 저장되는 위치 (이 디렉터리는 MySQL 실행 계정의 쓰기 권한이 필요하며 일반적으로 MySQL 데이터 저장 디렉터리로 설정됩니다.)
long_query_time 쿼리 초과 시간 1초마다 기록, 기본값은 10초
3. 느린 쿼리 켜기
(1) 느린 쿼리 관련 매개변수 보기
mysql> show variables like 'slow_query%'; +---------------------------+-----------------------------------+ | Variable_name | Value | +---------------------------+-----------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /usr/local/var/mysql/slow.log | +---------------------------+-----------------------------------+ mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+
(2) 설정 방법
방법 1: 전역 변수 설정
slow_query_log 전역 변수를 "ON" 상태로 설정
mysql> set global slow_query_log='ON';
느린 쿼리 로그가 저장되는 위치 설정
mysql> set global slow_query_log_file='/usr/local/var/mysql/slow.log ';
느린 쿼리 시간을 설정하고, 1초를 초과하면 쿼리를 기록
mysql> set global long_query_time=1;
방법 2: 구성 파일 설정
[mysqld] 아래 구성 파일 my.cnf를 수정합니다. 아래에
[mysqld] slow_query_log = ON slow_query_log_file = /usr/local/var/mysql/slow.log long_query_time = 1
를 추가합니다. (3) MySQL 서비스 다시 시작
service mysqld restart
(4) 느린 쿼리 로그 분석
느린 쿼리 로그 섹션 차단:
# Time: 180918 19:06:21 # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707197 # Query_time: 1.015429 Lock_time: 0.000116 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc; # User@Host: proxy[proxy] @ [192.168.0.16] Id: 6707236 # Query_time: 1.021662 Lock_time: 0.000083 Rows_sent: 1 Rows_examined: 44438 SET timestamp=1537268781; select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '14433' and app_type = 'YGY' order by binding_time desc;
여기에서 볼 수 있습니다:
Query_time(느린 쿼리 문의 쿼리 시간). 설정된 1초를 초과했습니다.
Rows_sent(느린 쿼리에서 반환된 레코드) 단 1
Rows_examined(느린 쿼리에서 스캔한 행 수) 여기서 44438이 반환되었습니다. -> 여기에서 문제가 크다는 것을 알 수 있습니다
이제 이 SQL 문을 데이터베이스에 넣어 실행하고 EXPLAIN을 사용하여 실행 계획을 분석하겠습니다
EXPLAIN select id, user_id, device_uuid, bd_client_id, bd_user_id, bd_tag, nodisturb_mode, nodisturb_start_time, nodisturb_end_time, binding_time, device_os_type, app_type, state from app_mobile_device where user_id = '78436' and app_type = 'YGY' order by binding_time desc;
쿼리 결과는 다음과 같습니다.
매개변수 설명: 여기에서 찾을 수 있습니다: 행은 쿼리의 행 수입니다. 쿼리 40,000줄 이상을 읽은 후에는 확실히 느립니다. 여기에는 여러 가지 조건이 있고 인덱스가 사용되지 않기 때문에 유일한 방법은 인덱스를 추가하는 것입니다. 선택 항목에 일반 다중 열 인덱스를 추가합니다. 왜냐하면 이 테이블의 디자인에 문제가 있었기 때문입니다. 시작하여 중복이 발생했습니다. 데이터, 고유 인덱스를 설정할 수 없습니다.ALTER TABLE app_mobile_device ADD INDEX user_app_type_only ( `user_id` ,`app_type` )인덱스가 설정되었습니다. 지금 바로 SQL의 실행 계획을 살펴보겠습니다. 확인된 행 수가 확실히 줄어든 것을 확인할 수 있습니다. 이제 슬로우 쿼리의 활용과 최적화는 기본적으로 완료되었습니다. 추천 학습: "
PHP 비디오 튜토리얼"
위 내용은 php mysql 느린 쿼리란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!