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_sent
bytes_received
packets_sent
packets_received
protocol_overhead_in
protocol_overhead_in = packets_received * 4
protocol_overhead_out
protocol_overhead_out = packets_received * 4
bytes_received_ok_packet
Nota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_ok
bytes_received_eof_packet
Nota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_eof
bytes_received_rset_header_packet
LOAD 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_header
bytes_received_rset_field_meta_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_field_meta
bytes_received_rset_row_packet
rows_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_row
bytes_received_prepare_response_packet
Nota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_prepare_response
bytes_received_change_user_packet
Nota: O tamanho total em bytes inclui o tamanho do pacote de cabeçalho. (4 bytes, consulte sobre sobrecarga do protocolo)
packets_received_change_user
packets_sent_command
bytes_received_real_data_normal
mysqlnd
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_ps
mysqlnd
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_queries
SELECT
, 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_queries
INSERT
, 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_queries
long_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_sets
Exemplos de chamadas API que armazenarão conjuntos de resultados em buffer no cliente: mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_sets
Exemplos de chamadas API que não armazenarão conjuntos de resultados em buffer no cliente: mysqli_use_result()
ps_buffered_sets
Exemplos de chamadas API que armazenarão conjuntos de resultados em buffer no cliente: mysqli_stmt_store_result()
ps_unbuffered_sets
flushed_normal_sets
Nota: 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_sets
Nota: 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_executed
ps_prepared_once_executed
rows_fetched_from_server_normal
rows_fetched_from_server_ps
packets_received_rset_row
.
rows_buffered_from_client_normal
Exemplos de consultas que irão armazenar resultados em buffer:
rows_buffered_from_server_ps
rows_buffered_from_client_normal
,
porém para instruções preparadas.
rows_fetched_from_client_normal_buffered
rows_fetched_from_client_ps_buffered
rows_fetched_from_client_normal_unbuffered
rows_fetched_from_client_ps_unbuffered
rows_fetched_from_client_ps_cursor
rows_skipped_normal
rows_skipped_ps
copy_on_write_saved
copy_on_write_performed
explicit_free_result
implicit_free_result
proto_text_fetched_null
MYSQL_TYPE_NULL
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_null
MYSQL_TYPE_NULL
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_bit
MYSQL_TYPE_BIT
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_bit
MYSQL_TYPE_BIT
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_tinyint
MYSQL_TYPE_TINY
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_tinyint
MYSQL_TYPE_TINY
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_short
MYSQL_TYPE_SHORT
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_short
MYSQL_TYPE_SHORT
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_int24
MYSQL_TYPE_INT24
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_int24
MYSQL_TYPE_INT24
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_int
MYSQL_TYPE_LONG
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_int
MYSQL_TYPE_LONG
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_bigint
MYSQL_TYPE_LONGLONG
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_bigint
MYSQL_TYPE_LONGLONG
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_decimal
MYSQL_TYPE_DECIMAL
ou MYSQL_TYPE_NEWDECIMAL
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_decimal
MYSQL_TYPE_DECIMAL
ou MYSQL_TYPE_NEWDECIMAL
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_float
MYSQL_TYPE_FLOAT
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_float
MYSQL_TYPE_FLOAT
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_double
MYSQL_TYPE_DOUBLE
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_double
MYSQL_TYPE_DOUBLE
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_date
MYSQL_TYPE_DATE
, or MYSQL_TYPE_NEWDATE
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_date
MYSQL_TYPE_DATE
, or MYSQL_TYPE_NEWDATE
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_year
MYSQL_TYPE_YEAR
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_year
MYSQL_TYPE_YEAR
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_time
MYSQL_TYPE_TIME
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_time
MYSQL_TYPE_TIME
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_datetime
MYSQL_TYPE_DATETIME
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_datetime
MYSQL_TYPE_DATETIME
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
ou MYSQL_TYPE_VARCHAR
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
ou MYSQL_TYPE_VARCHAR
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_blob
MYSQL_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_blob
MYSQL_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_enum
MYSQL_TYPE_ENUM
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_enum
MYSQL_TYPE_ENUM
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_set
MYSQL_TYPE_SET
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_set
MYSQL_TYPE_SET
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_geometry
MYSQL_TYPE_GEOMETRY
buscadas por uma consulta normal (protocolo de texto MySQL).
proto_binary_fetched_geometry
MYSQL_TYPE_GEOMETRY
buscadas por uma instrução preparada (protocolo binário MySQL).
proto_text_fetched_other
MYSQL_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_other
MYSQL_TYPE_*
não listadas previamente e
buscadas por uma instrução preparada (protocolo binário MySQL).
Nota: Em teoria, deveria ser sempre
0
.
connect_success
Nota:
connect_success
conté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_success
connect_failure
reconnect
active_connections
Nota: Número total de conexões ativas não persistentes é
active_connections - active_persistent_connections
.
active_persistent_connections
explicit_close
Exemplo #1 Exemplos de trechos de código que causam um fechamento explícito
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_close
Exemplo #2 Exemplos de trechos de código que causam um fechamento implícito
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_close
mysql_real_connect
durante uma tentativa de se
estabalecer uma conexão.
in_middle_of_command_close
A 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_count
mysqli_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_count
COM_*
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
COM_*
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_close
implicit_stmt_close
Nota: Uma instrução preparada é sempre fechada explicitamente. O único momento em que ela é fechaada implicitamente é quando sua preparação falha.
mem_emalloc_count
mem_emalloc_ammount
mem_ecalloc_count
mem_ecalloc_ammount
mem_realloc_count
mem_realloc_ammount
mem_efree_count
mem_malloc_count
mem_malloc_ammount
mem_calloc_count
mem_calloc_ammount
mem_ealloc_count
mem_ealloc_ammount
mem_free_count
command_buffer_too_small
COM_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