MySQL Native Driver 통계

통계 데이터 사용

MySQL Native Driver에는 클라이언트와 서버 간의 통신에 대한 통계 수집 지원이 포함되어 있습니다. 수집된 통계는 두 가지 주요 유형입니다.

  • 클라이언트 통계
  • 연결 통계

mysqli 확장을 사용하는 경우 이러한 통계는 두 가지 API 호출을 통해 얻을 수 있습니다.

메모:

통계는 MySQL Native Driver를 사용하는 모든 확장에서 집계됩니다. 예를 들어, MySQL Native Driver에 대해 ext/mysqlext/mysqli를 모두 컴파일할 때 ext/mysqlext/mysqli의 두 함수 호출은 통계를 변경합니다.

MySQL Native Driver에 대해 컴파일된 확장의 특정 API 호출이 특정 통계에 얼마나 영향을 미쳤는지 알 수 있는 방법이 없습니다. 선택적으로 MySQL 네이티브 드라이버를 사용하도록 PDO MySQL 드라이버, ext/mysqlext/mysqli를 구성할 수 있습니다. 그렇게 하면 세 가지 확장 프로그램이 모두 통계를 변경합니다.

클라이언트 통계 액세스

클라이언트 통계에 액세스하려면 mysqli_get_client_stats()를 호출해야 합니다. 함수 호출에는 매개변수가 필요하지 않습니다.

이 함수는 통계 이름을 키로 포함하고 통계 데이터를 값으로 포함하는 연관 배열을 반환합니다.

클라이언트 통계는 phpinfo() 함수를 호출하여 액세스할 수도 있습니다.

연결 통계 액세스

연결 통계에 액세스하려면 mysqli_get_connection_stats()를 호출하십시오. 이것은 데이터베이스 연결 핸들을 매개변수로 사용합니다.

이 함수는 통계 이름을 키로 포함하고 통계 데이터를 값으로 포함하는 연관 배열을 반환합니다.

버퍼링된 결과 세트와 버퍼링되지 않은 결과 세트

결과 세트는 버퍼링되거나 버퍼링되지 않을 수 있습니다. 기본 설정을 사용하여 ext/mysqlext/mysqli는 일반(준비되지 않은 명령문) 쿼리에 대해 버퍼링된 결과 세트와 함께 작동합니다. 버퍼링된 결과 집합은 클라이언트에서 캐시됩니다. 쿼리 실행 후 모든 결과는 MySQL 서버에서 가져와 클라이언트의 캐시에 저장됩니다. 버퍼링된 결과 집합의 가장 큰 장점은 클라이언트가 결과를 가져오면 서버가 결과 집합에 할당된 모든 리소스를 해제할 수 있다는 것입니다.

반면에 버퍼링되지 않은 결과 집합은 서버에 훨씬 더 오래 보관됩니다. 클라이언트의 메모리 소비를 줄이고 서버의 로드를 늘리려면 버퍼링되지 않은 결과를 사용하십시오. 높은 서버 부하를 경험하고 버퍼링되지 않은 결과 집합의 수치가 높은 경우 부하를 클라이언트로 이동하는 것을 고려해야 합니다. 클라이언트는 일반적으로 서버보다 확장성이 뛰어납니다. 로드는 메모리 버퍼만 참조하는 것이 아닙니다. 서버는 결과 집합을 해제하기 전에 파일 핸들 및 스레드와 같은 다른 리소스도 열어 두어야 합니다.

준비된 문은 기본적으로 버퍼링되지 않은 결과 집합을 사용합니다. 그러나 mysqli_stmt_store_result()를 사용하여 버퍼링된 결과 세트를 활성화할 수 있습니다.

MySQL 네이티브 드라이버에서 반환된 통계

다음 표는 mysqli_get_client_stats()mysqli_get_connection_stats() 함수에 의해 반환된 통계 목록을 보여줍니다.

반환된 mysqlnd 통계: 네트워크

Statistic Scope Description Notes
bytes_sent Connection PHP에서 MySQL 서버로 보낸 바이트 수 압축 프로토콜의 효율성을 확인하는 데 사용할 수 있습니다.
bytes_received Connection MySQL 서버에서 받은 바이트 수 압축 프로토콜의 효율성을 확인하는 데 사용할 수 있습니다.
packets_sent Connection 보낸 MySQL 클라이언트 서버 프로토콜 패킷 수 클라이언트 서버 프로토콜 구현 디버깅에 사용
packets_received Connection 수신된 MySQL 클라이언트 서버 프로토콜 패킷 수 클라이언트 서버 프로토콜 구현 디버깅에 사용
protocol_overhead_in Connection 들어오는 트래픽에 대한 MySQL 클라이언트 서버 프로토콜 오버헤드(바이트)입니다. 현재 패킷 헤더(4바이트)만 오버헤드로 간주됩니다. protocol_overhead_in = 패킷 수신 * 4 클라이언트 서버 프로토콜 구현 디버깅에 사용
protocol_overhead_out Connection 나가는 트래픽에 대한 MySQL 클라이언트 서버 프로토콜 오버헤드(바이트)입니다. 현재 패킷 헤더(4바이트)만 오버헤드로 간주됩니다. protocol_overhead_out = 패킷 전송 * 4 클라이언트 서버 프로토콜 구현 디버깅에 사용
bytes_received_ok_packet Connection 수신된 MySQL 클라이언트 서버 프로토콜 OK 패킷의 총 바이트 크기입니다. OK 패킷에는 상태 메시지가 포함될 수 있습니다. 상태 메시지의 길이는 다양할 수 있으므로 OK 패킷의 크기는 고정되어 있지 않습니다. CS 프로토콜 구현을 디버깅하는 데 사용됩니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
packets_received_ok Connection 수신된 MySQL 클라이언트 서버 프로토콜 OK 패킷의 수입니다. CS 프로토콜 구현을 디버깅하는 데 사용됩니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
bytes_received_eof_packet Connection 수신된 MySQL 클라이언트 서버 프로토콜 EOF 패킷의 총 크기(바이트)입니다. EOF는 서버 버전에 따라 크기가 다를 수 있습니다. 또한 EOF는 오류 메시지를 전송할 수 있습니다. CS 프로토콜 구현을 디버깅하는 데 사용됩니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
packets_received_eof Connection MySQL 클라이언트 서버 프로토콜 EOF 패킷의 수입니다. 다른 패킷 통계와 마찬가지로 PHP가 예를 들어 오류 메시지가 아닌 예상 패킷을 수신하지 않더라도 패킷 수는 증가합니다. CS 프로토콜 구현을 디버깅하는 데 사용됩니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
bytes_received_rset_header_packet Connection MySQL 클라이언트 서버 프로토콜 결과 집합 헤더 패킷의 총 크기(바이트)입니다. 패킷의 크기는 페이로드(LOAD LOCAL INFILE, INSERT, UPDATE, SELECT, 오류 메시지)에 따라 다릅니다. CS 프로토콜 구현을 디버깅하는 데 사용됩니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
packets_received_rset_header Connection MySQL 클라이언트 서버 프로토콜 결과 집합 헤더 패킷의 수입니다. CS 프로토콜 구현을 디버깅하는 데 사용됩니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
bytes_received_rset_field_meta_packet Connection MySQL 클라이언트 서버 프로토콜 결과 세트 메타 데이터(필드 정보) 패킷의 총 크기(바이트). 물론 크기는 결과 집합의 필드에 따라 다릅니다. 패킷은 또한 COM_LIST_FIELDS의 경우 오류 또는 EOF 패킷을 전송할 수 있습니다. CS 프로토콜 구현 디버깅에만 유용합니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
packets_received_rset_field_meta Connection MySQL 클라이언트 서버 프로토콜 결과 세트 메타 데이터(필드 정보) 패킷의 수입니다. CS 프로토콜 구현 디버깅에만 유용합니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
bytes_received_rset_row_packet Connection MySQL 클라이언트 서버 프로토콜 결과 집합 행 데이터 패킷의 총 크기(바이트)입니다. 패킷은 또한 오류 또는 EOF 패킷을 전송할 수 있습니다. bytes_received_rset_row_packet에서 rows_fetched_from_server_normalrows_fetched_from_server_ps를 빼서 오류 및 EOF 패킷 수를 리버스 엔지니어링할 수 있습니다. CS 프로토콜 구현 디버깅에만 유용합니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
packets_received_rset_row Connection MySQL 클라이언트 서버 프로토콜 결과 집합 행 데이터 패킷의 수와 총 크기(바이트)입니다. CS 프로토콜 구현 디버깅에만 유용합니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
bytes_received_prepare_response_packet Connection MySQL 클라이언트 서버 프로토콜의 총 크기(바이트)는 준비된 명령문 초기화 패킷(준비된 명령문 초기화 패킷)에 대해 OK입니다. 패킷은 오류를 전송할 수도 있습니다. 패킷 크기는 MySQL 버전에 따라 다릅니다. MySQL 4.1에서는 9바이트, MySQL 5.0에서는 12바이트입니다. 얼마나 많은 오류가 발생했는지 알 수 있는 안전한 방법은 없습니다. 예를 들어 항상 MySQL 5.0 이상에 연결하고 bytes_received_prepare_response_packet != packets_received_prepare_response * 12에 연결하는 경우 오류가 발생했다고 추측할 수 있습니다. ps_prepared_never_executed, ps_prepared_once_executed도 참조하십시오. CS 프로토콜 구현 디버깅에만 유용합니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
packets_received_prepare_response Connection 준비된 명령문 초기화 패킷(준비된 명령문 초기화 패킷)에 대해 OK인 MySQL 클라이언트 서버 프로토콜의 수입니다. CS 프로토콜 구현 디버깅에만 유용합니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
bytes_received_change_user_packet Connection MySQL 클라이언트 서버 프로토콜 COM_CHANGE_USER 패킷의 총 크기(바이트). 패킷은 오류 또는 EOF를 전송할 수도 있습니다. CS 프로토콜 구현 디버깅에만 유용합니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
packets_received_change_user Connection MySQL 클라이언트 서버 프로토콜 COM_CHANGE_USER 패킷 수 CS 프로토콜 구현 디버깅에만 유용합니다. 총 크기(바이트)에는 헤더 패킷의 크기가 포함됩니다(4바이트, 프로토콜 오버헤드 참조).
packets_sent_command Connection PHP에서 MySQL로 보낸 MySQL 클라이언트 서버 프로토콜 명령의 수입니다. 어떤 특정 명령이 전송되었는지 알 수 있는 방법은 없습니다. 기껏해야 PHP 바이너리에서 MySQL 지원을 비활성화하는 것을 고려할 수 있는지 알기 위해 PHP가 MySQL에 명령을 보냈는지 확인하는 데 사용할 수 있습니다. 또한 MySQL에 데이터를 보내는 동안 발생할 수 있는 오류 수를 리버스 엔지니어링할 수 있는 방법이 없습니다. 기록되는 유일한 오류는 command_buffer_too_small입니다(아래 참조). CS 프로토콜 구현 디버깅에만 유용합니다.
bytes_received_real_data_normal Connection 텍스트 프로토콜을 사용하여 mysqlnd에서 PHP 클라이언트가 가져온 페이로드의 바이트 수입니다. 이것은 준비된 명령문에서 시작되지 않고 PHP 클라이언트에서 가져온 결과 세트에 포함된 실제 데이터의 크기입니다. 전체 결과 세트가 mysqlnd에 의해 MySQL에서 추출되었을 수 있지만 이 통계는 PHP 클라이언트가 mysqlnd에서 가져온 실제 데이터만 계산합니다. 값을 증가시키는 코드 시퀀스의 예는 다음과 같습니다.
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->fetch_assoc();
$res->close();
                         

모든 가져오기 작업은 값을 증가시킵니다.

다음 예와 같이 결과 세트가 클라이언트에서만 버퍼링되고 페치되지 않는 경우 통계가 증가하지 않습니다.

$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->close();
                         
bytes_received_real_data_ps Connection 준비된 명령문 프로토콜을 사용하여 mysqlnd에서 PHP 클라이언트가 가져온 페이로드의 바이트 수입니다. 이것은 준비된 명령문에서 시작되고 PHP 클라이언트에서 가져온 결과 세트에 포함된 실제 데이터의 크기입니다. 결과 집합이 이후에 PHP 클라이언트에서 읽히지 않으면 값이 증가하지 않습니다. 전체 결과 세트가 mysqlnd에 의해 MySQL에서 추출되었을 수 있지만 이 통계는 PHP 클라이언트가 mysqlnd에서 가져온 실제 데이터만 계산합니다. bytes_received_real_data_normal도 참조하십시오.

결과 집합

반환된 mysqlnd 통계: 결과 집합

Statistic Scope Description Notes
result_set_queries Connection 결과 집합을 생성한 쿼리 수입니다. 결과 집합을 생성하는 쿼리의 예: SELECT, SHOW. 라인에서 결과 집합 헤더 패킷을 읽는 동안 오류가 발생하면 통계가 증가하지 않습니다. 예를 들어, 높은 데이터베이스 로드를 유발하는 클라이언트를 식별하기 위해 PHP가 MySQL에 보낸 쿼리 수에 대한 간접적인 측정으로 이를 사용할 수 있습니다.
non_result_set_queries Connection 결과 집합을 생성하지 않은 쿼리 수입니다. 결과 집합을 생성하지 않는 쿼리의 예: INSERT, UPDATE, LOAD DATA. 라인에서 결과 집합 헤더 패킷을 읽는 동안 오류가 발생하면 통계가 증가하지 않습니다. 예를 들어, 높은 데이터베이스 로드를 유발하는 클라이언트를 식별하기 위해 PHP가 MySQL에 보낸 쿼리 수에 대한 간접적인 측정으로 이를 사용할 수 있습니다.
no_index_used Connection 결과 집합을 생성했지만 인덱스를 사용하지 않은 쿼리의 수입니다(mysqld 시작 옵션 –log-queries-not-using-indexes 참조). 이러한 쿼리를 보고하려면 mysqli_report(MYSQLI_REPORT_INDEX)를 사용하여 ext/mysqli가 예외를 던지도록 할 수 있습니다. 예외 대신 경고를 선호하는 경우 mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT)를 사용하십시오.  
bad_index_used Connection 결과 집합을 생성했지만 좋은 인덱스를 사용하지 않은 쿼리의 수입니다(mysqld 시작 옵션 –log-slow-queries 참조). 이러한 쿼리를 보고하려면 mysqli_report(MYSQLI_REPORT_INDEX)를 사용하여 ext/mysqli가 예외를 던지도록 할 수 있습니다. 예외 대신 경고를 선호하는 경우 mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT)를 사용하십시오.
slow_queries Connection 실행하는 데 long_query_time 초 이상 걸리고 검사할 최소 min_examined_row_limit 행이 필요한 SQL 문. mysqli_report()를 통해 보고되지 않음
buffered_sets Connection 일반 쿼리에서 반환된 버퍼링된 결과 집합의 수입니다. 정상은 다음 주석에서 준비되지 않은 진술을 의미합니다. 클라이언트에서 결과 세트를 버퍼링하는 API 호출의 예: mysql_query(), mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result(). 클라이언트에서 결과 집합을 버퍼링하면 서버 리소스가 최대한 빨리 해제되고 결과 집합 스크롤이 더 쉬워집니다. 단점은 데이터 버퍼링에 대한 클라이언트의 추가 메모리 소비입니다. mysqlnd(MySQL 클라이언트 라이브러리와 달리)는 PHP 내부 메모리 관리 함수를 사용하여 메모리를 할당하기 때문에 PHP 메모리 제한을 준수합니다. 이것이 또한 memory_get_usage()가 MySQL 클라이언트 라이브러리 대신 mysqlnd를 사용할 때 더 높은 메모리 소비를 보고하는 이유이기도 합니다. memory_get_usage()는 MySQL 클라이언트 라이브러리가 함수에 의해 모니터링되는 PHP 내부 메모리 관리 함수를 사용하지 않기 때문에 MySQL 클라이언트 라이브러리의 메모리 소비를 전혀 측정하지 않습니다!
unbuffered_sets Connection 일반(준비되지 않은 명령문) 쿼리에서 반환된 버퍼되지 않은 결과 집합의 수입니다. 클라이언트에서 결과 세트를 버퍼링하지 않는 API 호출의 예: mysqli_use_result()
ps_buffered_sets Connection 준비된 명령문에서 반환된 버퍼링된 결과 집합의 수입니다. 기본적으로 준비된 문은 버퍼링되지 않습니다. 클라이언트에서 결과 세트를 버퍼링하는 API 호출의 예: mysqli_stmt_store_result
ps_unbuffered_sets Connection 준비된 명령문에서 반환된 버퍼되지 않은 결과 집합의 수. 기본적으로 준비된 문은 버퍼링되지 않습니다.
flushed_normal_sets Connection 자동으로 플러시된 읽지 않은 데이터가 있는 일반(준비되지 않은 문) 쿼리의 결과 집합 수입니다. 플러싱은 버퍼링되지 않은 결과 집합에서만 발생합니다. 버퍼링되지 않은 결과 집합은 연결에서 새 쿼리를 실행하기 전에 완전히 가져와야 합니다. 그렇지 않으면 MySQL에서 오류가 발생합니다. 애플리케이션이 버퍼링되지 않은 결과 집합에서 모든 행을 가져오지 않으면 mysqlnd는 암시적으로 결과 집합을 가져와서 라인을 지웁니다. rows_skipped_normal, rows_skipped_ps도 참조하세요. 암시적 플러시의 몇 가지 가능한 원인:
  • 결함이 있는 클라이언트 응용 프로그램
  • 클라이언트가 찾고 있는 것을 찾은 후 읽기를 중단했지만 MySQL이 필요한 것보다 더 많은 레코드를 계산하게 했습니다.
  • 클라이언트 응용 프로그램이 예기치 않게 중지되었습니다.
flushed_ps_sets Connection 자동으로 플러시된 읽지 않은 데이터가 있는 준비된 문의 결과 집합 수입니다. 플러싱은 버퍼링되지 않은 결과 집합에서만 발생합니다. 버퍼링되지 않은 결과 집합은 연결에서 새 쿼리를 실행하기 전에 완전히 가져와야 합니다. 그렇지 않으면 MySQL에서 오류가 발생합니다. 애플리케이션이 버퍼링되지 않은 결과 집합에서 모든 행을 가져오지 않으면 mysqlnd는 암시적으로 결과 집합을 가져와서 라인을 지웁니다. rows_skipped_normal, rows_skipped_ps도 참조하세요. 암시적 플러시의 몇 가지 가능한 원인:
  • 결함이 있는 클라이언트 응용 프로그램
  • 클라이언트가 찾고 있는 것을 찾은 후 읽기를 중단했지만 MySQL이 필요한 것보다 더 많은 레코드를 계산하게 했습니다.
  • 클라이언트 응용 프로그램이 예기치 않게 중지되었습니다.
ps_prepared_never_executed Connection 준비되었지만 실행되지 않은 명령문의 수입니다. 준비된 문은 서버 리소스를 차지합니다. 실행할 계획이 없으면 명령문을 준비하지 마십시오.
ps_prepared_once_executed Connection 하나만 실행된 준비된 명령문의 수입니다. 준비된 명령문의 이면에 있는 아이디어 중 하나는 명령문 실행이 별도의 준비 및 실행 단계로 분할되는 경우 동일한 쿼리가 (다른 매개변수를 사용하여) 반복해서 실행되고 일부 구문 분석 및 기타 준비 작업이 저장될 수 있다는 것입니다. 아이디어는 한 번 준비하고 결과를 캐시하는 것입니다(예: 여러 명령문 실행 중에 재사용할 구문 분석 트리). 준비된 명령문을 한 번만 실행하면 2단계 처리가 일반 쿼리에 비해 비효율적일 수 있습니다. 모든 캐싱은 추가 작업을 의미하고 캐시된 정보를 보유하기 위해 (제한된) 서버 리소스가 필요하기 때문입니다. 따라서 한 번만 실행되는 준비된 문은 성능 저하를 일으킬 수 있습니다.
rows_fetched_from_server_normal, rows_fetched_from_server_ps Connection 클라이언트 응용 프로그램이 해당 행을 사용했는지 여부에 관계없이 MySQL에서 성공적으로 가져온 총 결과 집합 행 수입니다. 일부 행은 클라이언트 응용 프로그램에서 가져오지 않았지만 암시적으로 플러시되었을 수 있습니다. packets_received_rset_row도 참조하십시오.
rows_buffered_from_client_normal, rows_buffered_from_client_ps Connection "일반" 쿼리 또는 준비된 명령문에서 성공적으로 버퍼링된 총 행 수입니다. 이것은 MySQL에서 가져와 클라이언트에서 버퍼링된 행 수입니다. 버퍼링된 행(MySQL에서 mysqlnd 내부 버퍼로)과 클라이언트 애플리케이션에서 가져온 버퍼링된 행(mysqlnd 내부 버퍼에서 클라이언트 애플리케이션으로)에 대한 두 가지 고유한 통계가 있습니다. 버퍼된 행의 수가 가져온 버퍼된 행의 수보다 높으면 클라이언트 응용 프로그램이 쿼리를 실행하여 필요한 것보다 큰 결과 집합을 발생시켜 클라이언트가 행을 읽지 못하는 결과를 초래할 수 있음을 의미할 수 있습니다. 결과를 버퍼링하는 쿼리의 예: mysqli_query(), mysqli_store_result()
rows_fetched_from_client_normal_buffered, rows_fetched_from_client_ps_buffered Connection 일반 쿼리 또는 준비된 명령문에 의해 생성된 버퍼링된 결과 집합에서 클라이언트가 가져온 총 행 수입니다.  
rows_fetched_from_client_normal_unbuffered, rows_fetched_from_client_ps_unbuffered Connection "일반" 쿼리 또는 준비된 명령문에 의해 생성된 버퍼링되지 않은 결과 집합에서 클라이언트가 가져온 총 행 수입니다.  
rows_fetched_from_client_ps_cursor Connection 준비된 명령문에 의해 생성된 커서에서 클라이언트가 가져온 총 행 수입니다.  
rows_skipped_normal, rows_skipped_ps Connection 향후 사용을 위해 예약됨(현재 지원되지 않음)  
copy_on_write_saved, copy_on_write_performed Process mysqlnd를 사용하면 확장에서 반환된 변수가 mysqlnd 내부 네트워크 결과 버퍼를 가리킵니다. 변수를 변경하지 않으면 가져온 데이터는 메모리에 한 번만 보관됩니다. 변수를 변경하면 mysqlnd는 내부 네트워크 결과 버퍼가 변경되지 않도록 보호하기 위해 copy-on-write를 수행해야 합니다. MySQL 클라이언트 라이브러리를 사용하면 가져온 데이터를 항상 메모리에 두 번 보유합니다. 내부 MySQL 클라이언트 라이브러리 버퍼에 한 번, 확장에 의해 반환된 변수에 한 번. 이론상 mysqlnd는 최대 40%의 메모리를 절약할 수 있습니다. 그러나 메모리 절약은 memory_get_usage()를 사용하여 측정할 수 없습니다.  
explicit_free_result, implicit_free_result Connection, Process (only during prepared statement cleanup) 해제된 결과 집합의 총 수입니다. free는 항상 명시적인 것으로 간주되지만 init 명령에 의해 생성된 결과 집합의 경우(예: mysqli_options(MYSQLI_INIT_COMMAND , ...))
proto_text_fetched_null, proto_text_fetched_bit, proto_text_fetched_tinyint proto_text_fetched_short, proto_text_fetched_int24, proto_text_fetched_int proto_text_fetched_bigint, proto_text_fetched_decimal, proto_text_fetched_float proto_text_fetched_double, proto_text_fetched_date, proto_text_fetched_year proto_text_fetched_time, proto_text_fetched_datetime, proto_text_fetched_timestamp proto_text_fetched_string, proto_text_fetched_blob, proto_text_fetched_enum proto_text_fetched_set, proto_text_fetched_geometry, proto_text_fetched_other Connection 일반 쿼리(MySQL 텍스트 프로토콜)에서 가져온 특정 유형의 총 열 수입니다. C API/MySQL 메타 데이터 유형에서 통계 이름으로 매핑:
  • MYSQL_TYPE_NULL - proto_text_fetched_null
  • MYSQL_TYPE_BIT - proto_text_fetched_bit
  • MYSQL_TYPE_TINY - proto_text_fetched_tinyint
  • MYSQL_TYPE_SHORT - proto_text_fetched_short
  • MYSQL_TYPE_INT24 - proto_text_fetched_int24
  • MYSQL_TYPE_LONG - proto_text_fetched_int
  • MYSQL_TYPE_LONGLONG - proto_text_fetched_bigint
  • MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NEWDECIMAL - proto_text_fetched_decimal
  • MYSQL_TYPE_FLOAT - proto_text_fetched_float
  • MYSQL_TYPE_DOUBLE - proto_text_fetched_double
  • MYSQL_TYPE_DATE, MYSQL_TYPE_NEWDATE - proto_text_fetched_date
  • MYSQL_TYPE_YEAR - proto_text_fetched_year
  • MYSQL_TYPE_TIME - proto_text_fetched_time
  • MYSQL_TYPE_DATETIME - proto_text_fetched_datetime
  • MYSQL_TYPE_TIMESTAMP - proto_text_fetched_timestamp
  • MYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, MYSQL_TYPE_VARCHAR - proto_text_fetched_string
  • MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB - proto_text_fetched_blob
  • MYSQL_TYPE_ENUM - proto_text_fetched_enum
  • MYSQL_TYPE_SET - proto_text_fetched_set
  • MYSQL_TYPE_GEOMETRY - proto_text_fetched_geometry
  • Any MYSQL_TYPE_* not listed before (there should be none) - proto_text_fetched_other

MYSQL_* 유형 상수는 모든 버전의 MySQL에서 동일한 SQL 열 유형과 연관되지 않을 수 있습니다.

proto_binary_fetched_null, proto_binary_fetched_bit, proto_binary_fetched_tinyint proto_binary_fetched_short, proto_binary_fetched_int24, proto_binary_fetched_int, proto_binary_fetched_bigint, proto_binary_fetched_decimal, proto_binary_fetched_float, proto_binary_fetched_double, proto_binary_fetched_date, proto_binary_fetched_year, proto_binary_fetched_time, proto_binary_fetched_datetime, proto_binary_fetched_timestamp, proto_binary_fetched_string, proto_binary_fetched_blob, proto_binary_fetched_enum, proto_binary_fetched_set, proto_binary_fetched_geometry, proto_binary_fetched_other Connection 준비된 명령문(MySQL 바이너리 프로토콜)에서 가져온 특정 유형의 총 열 수입니다. 유형 매핑에 대해서는 이전 텍스트에 설명된 proto_text_*를 참조하십시오.

반환된 mysqlnd 통계: 연결

Statistic Scope Description Notes
connect_success, connect_failure Connection 총 성공/실패 연결 시도 횟수입니다. 재사용된 연결 및 기타 모든 종류의 연결이 포함됩니다.
reconnect Process 이미 열린 연결 핸들에 대한 총 (실제_) 연결 시도 횟수입니다. 코드 시퀀스 $link = new mysqli(...); $link->real_connect(...) 재연결을 유발합니다. 하지만 $link = new mysqli(...); $link->connect(...)$link->connect(...)가 새 연결이 설정되기 전에 기존 연결을 명시적으로 닫기 때문에 하지 않습니다.
pconnect_success Connection 성공적인 영구 연결 시도의 총 횟수입니다. connect_success는 성공한 지속적 연결 시도와 비영구적 연결 시도의 합계를 보유합니다. 성공적인 비영구 연결 시도 횟수는 connect_success - pconnect_success입니다.
active_connections Connection 활성 지속 및 비영구 연결의 총 수입니다.  
active_persistent_connections Connection 활성 지속 연결의 총 수입니다. 활성 비영구 연결의 총 수는 active_connections - active_persistent_connections입니다.
explicit_close Connection 명시적으로 닫힌 총 연결 수(ext/mysqli만 해당). 명시적 닫기를 유발하는 코드 조각의 예: :
$link = new mysqli(...); $link->close(...)
$link = new mysqli(...); $link->connect(...)
                         
implicit_close Connection 암시적으로 닫힌 연결의 총 수(ext/mysqli만 해당). 암시적 닫기를 유발하는 코드 조각의 예: :
  • $link = new mysqli(...); $link->real_connect(...)
  • unset($link)
  • 영구 연결: 풀링된 연결이 real_connect로 생성되었으며 알 수 없는 옵션이 설정되어 있을 수 있습니다. 알 수 없는 옵션이 있는 연결이 반환되지 않도록 암시적으로 닫습니다.
  • 지속적인 연결: ping/change_user가 실패하고 ext/mysqli가 연결을 닫습니다.
  • 스크립트 실행 종료: 사용자가 닫지 않은 연결 닫기
disconnect_close Connection 연결 설정을 시도하는 동안 C API 호출 mysql_real_connect()에 의해 표시되는 연결 실패. C API 호출에 전달된 연결 핸들이 닫히기 때문에 disconnect_close라고 합니다.
in_middle_of_command_close Process 명령 실행 중에 연결이 닫혔습니다(쿼리를 보낸 후 답변을 검색하기 전, 데이터를 가져오는 동안, LOAD DATA로 데이터를 전송하는 동안 미해결 결과 집합을 가져오지 않음). 비동기 쿼리를 사용하지 않는 한 이것은 스크립트가 예기치 않게 중지되고 PHP가 연결을 종료하는 경우에만 발생합니다.
init_command_executed_count Connection 총 초기화 명령 실행 횟수(예: mysqli_options(MYSQLI_INIT_COMMAND , ...)). 성공한 실행 횟수는 init_command_executed_count - init_command_failed_count입니다.
init_command_failed_count Connection 실패한 초기화 명령의 총 수입니다.  

반환된 mysqlnd 통계: COM_* 명령

Statistic Scope Description Notes
com_quit, com_init_db, com_query, com_field_list, com_create_db, com_drop_db, com_refresh, com_shutdown, com_statistics, com_process_info, com_connect, com_process_kill, com_debug, com_ping, com_time, com_delayed_insert, com_change_user, com_binlog_dump, com_table_dump, com_connect_out, com_register_slave, com_stmt_prepare, com_stmt_execute, com_stmt_send_long_data, com_stmt_close, com_stmt_reset, com_stmt_set_option, com_stmt_fetch, com_daemon Connection PHP에서 MySQL로 특정 COM_* 명령을 보내려는 총 시도 횟수입니다. 라인을 확인한 후 해당 MySQL 클라이언트 서버 프로토콜 패킷을 보내기 직전에 통계가 증가합니다. mysqlnd가 유선으로 패킷을 보내는 데 실패하면 통계는 감소하지 않을 것입니다. In case of a failure mysqlnd emits a PHP warning Error while sending %s packet. PID=%d.

사용 예:

  • PHP가 MySQL에 특정 명령을 보내는지 확인하십시오. 예를 들어 클라이언트가 COM_PROCESS_KILL을 보내는지 확인하십시오.
  • COM_EXECUTECOM_PREPARE를 비교하여 준비된 명령문 실행의 평균 횟수를 계산합니다.
  • COM_QUERY가 0인지 확인하여 PHP가 준비되지 않은 SQL 문을 실행했는지 확인하십시오.
  • COM_QUERYCOM_EXECUTE를 확인하여 과도한 수의 SQL 문을 실행하는 PHP 스크립트 식별

Miscellaneous

반환된 mysqlnd 통계: 기타

Statistic Scope Description Notes
explicit_stmt_close, implicit_stmt_close Process 닫기 준비된 총 진술 수 닫기는 항상 명시적이지만 실패한 준비로 간주됩니다.
mem_emalloc_count, mem_emalloc_ammount, mem_ecalloc_count, mem_ecalloc_ammount, mem_erealloc_count, mem_erealloc_ammount, mem_efree_count, mem_malloc_count, mem_malloc_ammount, mem_calloc_count, mem_calloc_ammount, mem_realloc_count, mem_realloc_ammount, mem_free_count Process 메모리 관리 호출. 개발 전용.
command_buffer_too_small Connection PHP에서 MySQL로 명령을 보내는 동안 네트워크 명령 버퍼 확장의 수입니다. mysqlnd는 모든 연결에 대해 mysqlnd.net_cmd_buffer_size(php.ini) 바이트의 내부 명령/네트워크 버퍼를 할당합니다. 예를 들어 COM_QUERY(일반 쿼리)와 같은 MySQL 클라이언트 서버 프로토콜 명령이 버퍼에 맞지 않으면 mysqlnd는 명령을 보내는 데 필요한 만큼 버퍼를 늘립니다. 하나의 연결에 대해 버퍼가 확장될 때마다 command_buffer_too_small이 1씩 증가합니다.

mysqlnd가 거의 모든 연결에 대해 초기 크기인 mysqlnd.net_cmd_buffer_size(php.ini) 바이트 이상으로 버퍼를 늘려야 하는 경우, 재할당을 피하기 위해 기본 크기를 늘리는 것을 고려해야 합니다.

기본 버퍼 크기는 가능한 가장 작은 값인 4096바이트입니다. 기본값은 php.ini 설정 mysqlnd.net_cmd_buffer_size 또는 mysqli_options(MYSQLI_OPT_NET_CMD_BUFFER_SIZE, int size)를 사용하여 변경할 수 있습니다.

connection_reused