O Driver Nativo MySQL contém suporte para coleta de estatísticas sobre a comunicação entre o cliente e o servidor. As estatísticas recolhidas são de dois tipos principais:
Ao usar a extensão mysqli, essas estatísticas poderão ser obtidas através de duas chamadas de API:
Nota: As estatísticas são agregadas entre todas as extensões que utilizam o Driver Nativo MySQL. Por exemplo, se a extensão mysqli e o driver PDO MySQL estiverem ambos configurados para usar MySQLnd, as chamadas de função de mysqli e chamadas de métodos do PDO afetarão as estatísticas. Não há como saber o quanto uma determinada chamada de API de qualquer extensão que tenha sido compilada contra o Driver Nativo MySQL tenha impactado uma determinada estatística.
Estatísticas do cliente podem ser obtidas chamando a função mysqli_get_client_stats()
Estatísticas de conexão podem ser obtidas chamando a função mysqli_get_connection_stats().
Ambas as funções retornam um array associativo, onde o nome da estatística é a chave para o dado estatístico correspondente.
A maior parte das estatíticas são associadas a uma conexão mas algumas são associadas ao processo, e neste caso isto será mencionado no texto.
As seguintes estatísticas são produzidas pelo Driver Nativo MySQL:
bytes_sentbytes_receivedpackets_sentpackets_receivedprotocol_overhead_inprotocol_overhead_in = packets_received * 4
protocol_overhead_outprotocol_overhead_out = packets_received * 4
bytes_received_ok_packetNota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_okbytes_received_eof_packetNota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_eofbytes_received_rset_header_packetLOAD LOCAL INFILE, INSERT,
UPDATE, SELECT, mensagem de erro).
Nota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_rset_headerbytes_received_rset_field_meta_packetNota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_rset_field_metabytes_received_rset_row_packetrows_fetched_from_server_normal
e rows_fetched_from_server_ps
de bytes_received_rset_row_packet.
Nota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_rset_rowbytes_received_prepare_response_packetNota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_prepare_responsebytes_received_change_user_packetNota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_change_userpackets_sent_commandbytes_received_real_data_normalmysqlnd usando o protocolo de texto.
Este é o tamanho dos dados reais contidos nos conjuntos de resultados que não
se originaram de instruções preparadas e que foram buscados pelo cliente PHP.
Observe que embora um conjunto de resultados completo possa ter sido puxado do MySQL
pelo mysqlnd, esta estatística apenas conta dados reais
puxados a partir do mysqlnd pelo cliente PHP.
A seguir é apresentado um exemplo de sequência de código que irá incrementar o valor:
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->fetch_assoc();
$res->close();
Entretanto, a estatística não será incrementada se o conjunto de resultados estiver sujeito a buffer no lado do cliente mas não for buscado, como no exemplo a seguir:
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->close();
bytes_received_real_data_psmysqlnd usando o protocolo de instruções preparadas.
Este é o tamanho dos dados reais contidos nos conjuntos de resultados que
se originaram de instruções preparadas e que foram buscados pelo cliente PHP.
O valor não será incrementado se o conjunto de resultados não for subsequentemente lido pelo cliente PHP.
Observe que embora um conjunto de resultados completo possa ter sido puxado do MySQL
pelo mysqlnd, esta estatística apenas conta dados reais
puxados a partir do mysqlnd pelo cliente PHP.
Consulte também bytes_received_real_data_normal.
result_set_queriesSELECT, SHOW.
A estatística não será incrementada se ocorrer um erro ao ler
o pacote de cabeçalho do conjunto de resultados.
Nota: Esta estatística pode ser usada como uma medição indireta do número de consultas que o PHP enviou ao MySQL. Isto pode ajudar a identificar um cliente que causa uma carga alta no banco de dados.
non_result_set_queriesINSERT, UPDATE, LOAD DATA.
A estatística não será incrementada se ocorrer um erro ao ler
o pacote de cabeçalho do conjunto de resultados.
Nota: Esta estatística pode ser usada como uma medição indireta do número de consultas que o PHP enviou ao MySQL. Isto pode ajudar a identificar um cliente que causa uma carga alta no banco de dados.
no_index_used--log-queries-not-using-indexes).
Nota: Essas consultas podem ser reportadas através de uma exceção com
mysqli_report(MYSQLI_REPORT_INDEX);. É possível reportá-las também através de um alerta commysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);.
bad_index_used--log-slow-queries).
Nota: Essas consultas podem ser reportadas através de uma exceção com
mysqli_report(MYSQLI_REPORT_INDEX);. É possível reportá-las também através de um alerta commysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);.
slow_querieslong_query_time
segundos para execução e requereram que pelo menos
min_examined_row_limit registros fossem examinados.
Não reportada através de mysqli_report().
buffered_setsExemplos de chamadas API que armazenarão conjuntos de resultados em buffer no cliente: mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_setsExemplos de chamadas API que não armazenarão conjuntos de resultados em buffer no cliente: mysqli_use_result()
ps_buffered_setsExemplos de chamadas API que armazenarão conjuntos de resultados em buffer no cliente: mysqli_stmt_store_result()
ps_unbuffered_setsflushed_normal_setsNota: Os descarregamento ocorre somente com conjuntos de resultados sem buffer. Conjuntos de resultados sem buffer devem ser buscados integralmente antes que uma nova consulta possa ser executada na conexão, caso contrário o MySQL lançará um erro. Se a aplicação não buscar todos os registros de um conjunto de resultados sem buffer, o mysqlnd não busca implicitamente o conjunto de resultados para limpar a linha de dados. Consulta também
rows_skipped_normal,rows_skipped_ps.Algumas causas possíveis para um descarregamento implícito:
- Aplicação cliente com falhas
- Cliente parou de ler depois de ter encontrado o que estava procurando mas fez o MySQL calcular mais registros que o necessário
- Aplicação cliente parou inesperadamente
flushed_ps_setsNota: Os descarregamento ocorre somente com conjuntos de resultados sem buffer. Conjuntos de resultados sem buffer devem ser buscados integralmente antes que uma nova consulta possa ser executada na conexão, caso contrário o MySQL lançará um erro. Se a aplicação não buscar todos os registros de um conjunto de resultados sem buffer, o mysqlnd não busca implicitamente o conjunto de resultados para limpar a linha de dados. Consulta também
rows_skipped_normal,rows_skipped_ps.Algumas causas possíveis para um descarregamento implícito:
- Aplicação cliente com falhas
- Cliente parou de ler depois de ter encontrado o que estava procurando mas fez o MySQL calcular mais registros que o necessário
- Aplicação cliente parou inesperadamente
ps_prepared_never_executedps_prepared_once_executedrows_fetched_from_server_normalrows_fetched_from_server_pspackets_received_rset_row.
rows_buffered_from_client_normalExemplos de consultas que irão armazenar resultados em buffer:
rows_buffered_from_client_psrows_buffered_from_client_normal,
porém para instruções preparadas.
rows_fetched_from_client_normal_bufferedrows_fetched_from_client_ps_bufferedrows_fetched_from_client_normal_unbufferedrows_fetched_from_client_ps_unbufferedrows_fetched_from_client_ps_cursorrows_skipped_normalrows_skipped_pscopy_on_write_savedcopy_on_write_performedexplicit_free_resultimplicit_free_resultproto_text_fetched_nullMYSQL_TYPE_NULL
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_nullMYSQL_TYPE_NULL
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_bitMYSQL_TYPE_BIT
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_bitMYSQL_TYPE_BIT
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_tinyintMYSQL_TYPE_TINY
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_tinyintMYSQL_TYPE_TINY
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_shortMYSQL_TYPE_SHORT
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_shortMYSQL_TYPE_SHORT
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_int24MYSQL_TYPE_INT24
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_int24MYSQL_TYPE_INT24
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_intMYSQL_TYPE_LONG
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_intMYSQL_TYPE_LONG
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_bigintMYSQL_TYPE_LONGLONG
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_bigintMYSQL_TYPE_LONGLONG
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_decimalMYSQL_TYPE_DECIMAL ou MYSQL_TYPE_NEWDECIMAL
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_decimalMYSQL_TYPE_DECIMAL ou MYSQL_TYPE_NEWDECIMAL
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_floatMYSQL_TYPE_FLOAT
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_floatMYSQL_TYPE_FLOAT
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_doubleMYSQL_TYPE_DOUBLE
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_doubleMYSQL_TYPE_DOUBLE
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_dateMYSQL_TYPE_DATE ou MYSQL_TYPE_NEWDATE
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_dateMYSQL_TYPE_DATE ou MYSQL_TYPE_NEWDATE
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_yearMYSQL_TYPE_YEAR
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_yearMYSQL_TYPE_YEAR
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_timeMYSQL_TYPE_TIME
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_timeMYSQL_TYPE_TIME
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_datetimeMYSQL_TYPE_DATETIME
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_datetimeMYSQL_TYPE_DATETIME
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_timestampMYSQL_TYPE_TIMESTAMP
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_timestampMYSQL_TYPE_TIMESTAMP
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING ou MYSQL_TYPE_VARCHAR
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING ou MYSQL_TYPE_VARCHAR
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
MYSQL_TYPE_LONG_BLOB
ou MYSQL_TYPE_BLOB
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
MYSQL_TYPE_LONG_BLOB
ou MYSQL_TYPE_BLOB
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_enumMYSQL_TYPE_ENUM
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_enumMYSQL_TYPE_ENUM
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_setMYSQL_TYPE_SET
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_setMYSQL_TYPE_SET
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_geometryMYSQL_TYPE_GEOMETRY
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_geometryMYSQL_TYPE_GEOMETRY
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_otherMYSQL_TYPE_*
não listadas previamente e
buscadas por uma consulta normal (protocolo de texto MySQL).
Nota: Em teoria, deveria ser sempre
0.
proto_binary_fetched_otherMYSQL_TYPE_*
não listadas previamente e
buscadas por uma instrução preparada (protocolo binário MySQL).
Nota: Em teoria, deveria ser sempre
0.
connect_successNota:
connect_successcontém a soma de tentativas bem sucedidas de conexões persistentes e não persistentes. Portanto, o número de tentativas bem sucedidas de conexões não persistentes éconnect_success - pconnect_success.
pconnect_successconnect_failurereconnectactive_connectionsNota: Número total de conexões ativas não persistentes é
active_connections - active_persistent_connections.
active_persistent_connectionsexplicit_closeExemplo #1 Exemplos de trechos de código que causam um fechamento explícito
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_closeExemplo #2 Exemplos de trechos de código que causam um fechamento implícito
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_closemysql_real_connect durante uma tentativa de se
estabalecer uma conexão.
in_middle_of_command_closeA menos que consultas assíncronas sejam usadas, isto só deve acontecer se a aplicação PHP terminar inesperadamente e o PHP fechar a conexão automaticamente.
init_command_executed_countmysqli_options(MYSQLI_INIT_COMMAND , $value).
O número total de execuções bem sucedidas é
init_command_executed_count - init_command_failed_count.
init_command_failed_countCOM_*
com_quitcom_init_dbcom_querycom_field_listcom_create_dbcom_drop_dbcom_refreshcom_shutdowncom_statisticscom_process_infocom_connectcom_process_killcom_debugcom_pingcom_timecom_delayed_insertcom_change_usercom_binlog_dumpcom_table_dumpcom_connect_outcom_register_slavecom_stmt_preparecom_stmt_executecom_stmt_send_long_datacom_stmt_closecom_stmt_resetcom_stmt_set_optioncom_stmt_fetchcom_daemonCOM_*
do PHP para o MySQL.
As estatísticas são incrementadas após verificação da linha de dados e imediatamente
antes do envio do pacote correspondente do protocolo Cliente Servidor do MySQL.
Se o MySQLnd falhar ao enviar o pacote pela rede, a estatística não será decrementada.
Em caso de falha, o MySQLnd emite um alerta do PHP
Error while sending %s packet. PID=%d.
Exemplo #3 Exemplos de uso
Verificar se o PHP envia certos comandos ao MySQL, por exemplo,
verificar se o cliente envia COM_PROCESS_KILL
Calcular o número médio de execuções de instruções preparadas
comparando COM_EXECUTE com
COM_PREPARE
Verificar se o PHP executou alguma instrução SQL não preparada
observando se COM_QUERY é igual a zero
Identificar scripts PHP que executam um número excessivo de instruções
SQL, verificando COM_QUERY e
COM_EXECUTE
explicit_stmt_closeimplicit_stmt_closeNota: Uma instrução preparada é sempre fechada explicitamente. O único momento em que ela é fechaada implicitamente é quando sua preparação falha.
mem_emalloc_countmem_emalloc_ammountmem_ecalloc_countmem_ecalloc_ammountmem_realloc_countmem_realloc_ammountmem_efree_countmem_malloc_countmem_malloc_ammountmem_calloc_countmem_calloc_ammountmem_ealloc_countmem_ealloc_ammountmem_free_countcommand_buffer_too_smallCOM_QUERY (consulta normal),
não couber no buffer,
o MySQLnd aumentará o buffer para o tamanho necessário para envio do comando.
Sempre que o buffer for estendido para uma conexão,
command_buffer_too_small será incrementada em uma unidade.
Se o MySQLnd tiver que aumentar o buffer para além do seu tamanho inicial de
mysqlnd.net_cmd_buffer_size
bytes para quase todas as conexões,
deve ser considerado aumento do tamanho padrão para evitar
realocações.
connection_reused