CakeFest 2024: The Official CakePHP Conference

Estatísticas

Usando Dados Estatísticos

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:

  • Estatísticas de cliente

  • Estatísticas de conexão

Se extensão mysqli estiver sendo utilizada, 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, ao compilar ext/mysql e ext/mysqli no Driver Nativo MySQL, ambas as chamadas de função de ext/mysql e ext/mysqli mudará 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. Pode-se configurar o Driver MySQL PDO, ext/mysql e ext/mysqli para opcionalmente utilizar o Driver Nativo MySQL. Ao fazer isso, todas as três extensões alterarão as estatísticas.

Acessando Estatísticas de Cliente

Para acessar as estatísticas do cliente, é necessário chamar mysqli_get_client_stats(). A chamada de função não requer nenhum parâmetro.

A função retorna uma matriz associativa que contém o nome da estatística como chave e os dados estatísticos como valor.

As estatísticas do cliente também podem ser acessadas chamando a função phpinfo().

Acessando Estatísticas de Conexão

Para acessar as estatísticas de conexão, é necessário chamar mysqli_get_connection_stats(). Isso usa o identificador de conexão do banco de dados como parâmetro.

A função retorna uma matriz associativa que contém o nome da estatística como chave e os dados estatísticos como valor.

Conjunto de Resultados com e sem Buffer

Os conjuntos de resultados podem ser armazenados em buffer ou sem buffer. Usando configurações padrão, ext/mysql e ext/mysqli funcionam com conjuntos de resultados armazenados em buffer para consultas normais (instruções não preparadas). Os conjuntos de resultados armazenados em buffer são armazenados em cache no cliente. Após a execução da consulta todos os resultados são buscados no servidor MySQL e armazenados em cache no cliente. A grande vantagem dos conjuntos de resultados em buffer é que eles permitem que o servidor libere todos os recursos alocados para um conjunto de resultados, uma vez que os resultados tenham sido buscados pelo cliente.

Por outro lado, os conjuntos de resultados sem buffer são mantidos por muito mais tempo no servidor. Se for desejado reduzir o consumo de memória no cliente, mas aumentando a carga no servidor, use resultados sem buffer. Se for observada uma carga alta no servidor e os números dos conjuntos de resultados sem buffer forem altos, considere mover a carga para os clientes. Os clientes normalmente escalam melhor que os servidores. Carga não se refere apenas a buffers de memória - o servidor também precisa manter outros recursos abertos, por exemplo, identificadores de arquivos e threads, antes que um conjunto de resultados possa ser liberado.

As instruções preparadas usam conjuntos de resultados sem buffer por padrão. Entretanto, pode-se usar mysqli_stmt_store_result() para habilitar conjuntos de resultados em buffer.

Estetísticas Retornadas pelo Driver Nativo MySQL

A tabela a seguir mostra uma lista de estatísticas retornadas pelas funções mysqli_get_client_stats() e mysqli_get_connection_stats().

Estatísticas mysqlnd retornadas: Rede
Estatística Escopo Descrição Notas
bytes_sent Conexão Número de bytes enviados pelo PHP para o servidor MySQL Pode ser usada para verificar a eficiência do protocolo de compressão
bytes_received Conexão Número de bytes recebidos do servidor MySQL Pode ser usada para verificar a eficiência do protocolo de compressão
packets_sent Conexão Número de pacotes do protocolo Cliente-Servidor do MySQL enviados Usada para depurar a implementação do protocolo Cliente-Servidor
packets_received Conexão Número de pacotes do protocolo Cliente-Servidor do MySQL recebidos Usada para depurar a implementação do protocolo Cliente-Servidor
protocol_overhead_in Conexão Sobrecarga do protocolo Cliente-Servidor do MySQL em bytes para tráfego de entrada. Atualmente apenas o Cabeçalho do Pacote (4 bytes) é considerado sobrecarga. protocol_overhead_in = pacotes_recebidos * 4 Usada para depurar a implementação do protocolo Cliente-Servidor
protocol_overhead_out Conexão Sobrecarga do protocolo Cliente-Servidor do MySQL em bytes para tráfego de saída. Atualmente apenas o Cabeçalho do Pacote (4 bytes) é considerado sobrecarga. protocol_overhead_out = pacotes_enviados * 4 Usada para depurar a implementação do protocolo Cliente-Servidor
bytes_received_ok_packet Conexão Tamanho total de bytes de pacotes OK do protocolo Cliente-Servidor do MySQL recebidos. Pacotes OK podem conter uma mensagem de status. O comprimento da mensagem de status pode variar e, portanto, o tamanho de um pacote OK não é fixo. Usado para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
packets_received_ok Conexão Número de pacotes OK recebidos pelo protocolo Cliente-Servidor do MySQL. Usado para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
bytes_received_eof_packet Conexão Tamanho total em bytes dos pacotes EOF do protocolo Cliente-Servidor do MySQL recebidos. O EOF pode variar em tamanho dependendo da versão do servidor. Além disso, o EOF pode transportar uma mensagem de erro. Usado para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
packets_received_eof Conexão Número de pacotes EOF do protocolo Cliente-Servidor do MySQL. Tal como acontece com outras estatísticas de pacotes, o número de pacotes aumentará mesmo se o PHP não receber o pacote esperado, mas, por exemplo, uma mensagem de erro. Usado para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
bytes_received_rset_header_packet Conexão Tamanho total em bytes dos pacotes de cabeçalho do conjunto de resultados do protocolo Cliente-Servidor do MySQL. O tamanho dos pacotes varia dependendo da carga (LOAD LOCAL INFILE, INSERT, UPDATE, SELECT, mensagem de erro). Usado para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
packets_received_rset_header Conexão Número de pacotes de cabeçalho do conjunto de resultados do protocolo Cliente-Servidor do MySQL. Usado para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
bytes_received_rset_field_meta_packet Conexão Tamanho total em bytes dos pacotes (informação de campo) dos metadados do conjunto de resultados do protocolo Cliente-Servidor do MySQL. Obviamente o tamanho varia com os campos do conjunto de resultados. O pacote também pode transportar um erro ou um pacote de EOF no caso de COM_LIST_FIELDS. Útil somente para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
packets_received_rset_field_meta Conexão Número de pacotes (informação de campo) dos metadados do conjunto de resultados do protocolo Cliente-Servidor do MySQL. Útil somente para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
bytes_received_rset_row_packet Conexão Tamanho total em bytes dos pacotes de dados do conjunto de resultados do protocolo Cliente-Servidor do MySQL. O pacote também pode transportar um erro ou um pacote de EOF. Pode-se fazer engenharia reversa do número de erros e pacotes EOF subtraindo rows_fetched_from_server_normal e rows_fetched_from_server_ps de bytes_received_rset_row_packet. Útil somente para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
packets_received_rset_row Conexão Número de pacotes de dados do conjunto de resultados do protocolo Cliente-Servidor do MySQL e seu tamanho total em bytes. Útil somente para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
bytes_received_prepare_response_packet Conexão Tamanho total em bytes dos pacotes OK para Inicialização de Instruções Preparadas do protocolo Cliente-Servidor do MySQL. O pacote também pode transportar um erro. O tamanho do pacote depende da versão MySQL: 9 bytes com MySQL 4.1 e 12 bytes a partir do MySQL 5.0. Não existe maneira segura de saber quantos erros aconteceram. Pode ser possível inferir que um erro ocorreu se, por exemplo, sempre se conectar ao MySQL 5.0 ou superior e bytes_received_prepare_response_packet != packets_received_prepare_response * 12. Consulte também ps_prepared_never_executed e ps_prepared_once_executed. Útil somente para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
packets_received_prepare_response Conexão Número de pacotes OK para Inicialização de Instruções Preparadas do protocolo Cliente-Servidor do MySQL. Útil somente para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
bytes_received_change_user_packet Conexão Tamanho total em bytes dos pacotes COM_CHANGE_USER do protocolo Cliente-Servidor do MySQL. O pacote pode também transportar um erro ou um EOF. Útil somente para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
packets_received_change_user Conexão Number de pacotes COM_CHANGE_USER do protocolo Cliente-Servidor do MySQL Útil somente para depurar a implementação do protocolo CS. Observe que o tamanho total em bytes inclui o tamanho do pacote de cabeçalho (4 bytes, consulte sobrecarga de protocolo).
packets_sent_command Conexão Número de comandos enviados do PHP para o MySQL no protocolo Cliente-Servidor do MySQL. Não há como saber que comandos específicos ou quantos deles foram enviados. No melhor caso pode-se usar esta estatística para verificar se o PHP enviou algum comando para o MySQL, para saber se pode-se considerar desabilitar o suporte ao MySQL no binário PHP. Também não há como fazer engenharia reversa do número de erros que podem ter ocorrido durante envio de dados para o MySQL. O único erro registrado é command_buffer_too_small (veja abaixo). Útil somente para depurar a implementação do protocolo CS.
bytes_received_real_data_normal Conexão Número de bytes da carga buscada pelo cliente PHP a partir do mysqlnd usando o protocolo de texto. Este é o tamanho dos dados reais contidos nos conjuntos de resultados que não se originam de instruções preparadas e que foram buscados pelo cliente PHP. Observe que embora um conjunto de resultados completo pode ter sido puxado do MySQL pelo mysqlnd, esta estatística conta somente dados reais puxados do mysqlnd pelo cliente PHP. Um exemplo de uma sequência de código que irá aumentar o valor está apresentado abaixo:
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->fetch_assoc();
$res->close();

Cada operação de busca irá aumentar o valor.

A estatística não aumentará se o conjunto de resultados for apenas armazenado em buffer no cliente, mas não buscado, como no exemplo a seguir:

$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->close();
bytes_received_real_data_ps Conexão Número de bytes da carga buscada pelo cliente PHP a partir do mysqlnd usando o protocolo de instruções preparadas. Este é o tamanho dos dados reais contidos nos conjuntos de resultados que se originam de instruções preparadas e que foram buscados pelo cliente PHP. O valor não será aumentado se o conjunto de resultados não for subsequentemente lido pelo cliente PHP. Observe que embora um conjunto de resultados completo pode ter sido puxado do MySQL pelo mysqlnd, esta estatística conta apenas dados reais puxados do mysqlnd pelo cliente PHP. Consulte também bytes_received_real_data_normal.

Conjunto de Resultados

Estatísticas retornadas pelo mysqlnd: Conjunto de Resultados
Estatística Escopo Descrição Notas
result_set_queries Conexão Número de consultas que geraram um conjunto de resultados. Exemplos de consultas que geram um conjunto de resultados: SELECT, SHOW. A estatística não será incrementada se houver um erro ao ler, da linha, o pacote de cabeçalho do conjunto de resultados. Pode-se usar uma medida indireta para o número de consultas que o PHP enviou ao MySQL, por exemplo, para identificar um cliente que causa uma carga alta no banco de dados.
non_result_set_queries Conexão Número de consultas que não geraram um conjunto de resultados. Exemplos de consultas que não geram um conjunto de resultados: INSERT, UPDATE, LOAD DATA. A estatística não será incrementada se houver um erro ao ler, da linha, o pacote de cabeçalho do conjunto de resultados. Pode-se usar uma medida indireta para o número de consultas que o PHP enviou ao MySQL, por exemplo, para identificar um cliente que causa uma carga alta no banco de dados.
no_index_used Conexão Número de consultas que geraram um conjunto de resultados mas não usaram um índice (veja também a opção de início do mysqld –log-queries-not-using-indexes). Se for desejado que estas consultas sejam reportadas pode-se usar mysqli_report(MYSQLI_REPORT_INDEX) para fazer com que ext/mysqli lance uma exceção. Se for preferido um alerta ao invés de uma exceção, use mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT).  
bad_index_used Conexão Número de consultas que geraram um conjunto de resultados mas não usaram um índice bom (veja também a opção de início do mysqld –log-slow-queries). Se for desejado que estas consultas sejam reportadas pode-se usar mysqli_report(MYSQLI_REPORT_INDEX) para fazer com que ext/mysqli lance uma exceção. Se for preferido um alerta ao invés de uma exceção, use mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT)
slow_queries Conexão Instruções SQL que levaram mais de long_query_time segundos para serem executadas e que precisaram de pelo menos min_examined_row_limit linhas examinadas. Não reportada através de mysqli_report()
buffered_sets Conexão Número de conjuntos de resultados em buffer retornados por consultas normais. Normais significam aquelas que não são instruções preparadas nas notas a seguir. Examplos de chamadas de API que farão uso de buffer de conjuntos de resultados no cliente: mysql_query(), mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result(). Fazer buffer de resultados no cliente assegura que os recursos do servidor são liberados assim que possível e torna a rolagem do conjunto de resultados mais fácil. A desvantagem é o consumo adicional de memória no cliente para armazenar os dados em buffer. Observe que o mysqlnd (ao contrário da Biblioteca Cliente MySQL) respeita o limite de memória do PHP porque usa as funções de gerenciamento internas do PHP para alocar memória. Esta também é a razão pela qual memory_get_usage() reporta um consumo maior de memória quando usa o mysqlnd ao invés da Biblioteca Cliente do MySQL. memory_get_usage() não mede de maneira nenhuma o consumo de memória da Biblioteca Cliente MySQL porque a biblioteca não usa as funções de gerenciamento de memória internas do PHP, monitoradas pela função!
unbuffered_sets Conexão Número de conjuntos de resultados sem buffer retornados por consultas normais (instruções não preparadas). Examplos de chamadas de API que não farão uso de buffer de conjuntos de resultados no cliente: mysqli_use_result()
ps_buffered_sets Conexão Número de conjuntos de resultados com buffer retornados por instruções preparadas. Por padrão, instruções preparadas são sem buffer. Examplos de chamadas de API que farão uso de buffer de conjuntos de resultados no cliente: mysqli_stmt_store_result
ps_unbuffered_sets Conexão Número de conjuntos de resultados sem buffer retornados por instruções preparadas. Por padrão, instruções preparadas são sem buffer.
flushed_normal_sets Conexão Número de conjuntos de resultados de consultas normais (instrução não preparada) com dados não lidos que foram liberados silenciosamente. A liberação ocorre apenas com conjuntos de resultados sem buffer. Os conjuntos de resultados sem buffer devem ser buscados completamente antes que uma nova consulta possa ser executada na conexão, caso contrário o MySQL gerará um erro. Se a aplicação não buscar todas as linhas de um conjunto de resultados sem buffer, o mysqlnd buscará implicitamente o conjunto de resultados para limpar a linha. Veja também rows_skipped_normal, rows_skipped_ps. Algumas causas possíveis para uma liberação implícita:
  • Aplicação cliente com defeito

  • O cliente parou de ler depois de encontrar o que procurava, mas fez o MySQL calcular mais registros do que o necessário

  • A aplicação cliente parou inesperadamente

flushed_ps_sets Conexão Número de conjuntos de resultados de instruções preparadas com dados não lidos que foram liberados silenciosamente para você. A liberação ocorre apenas com conjuntos de resultados sem buffer. Conjuntos de resultados sem buffer devem ser buscados completamente antes que uma nova consulta possa ser executada na conexão, caso contrário o MySQL irá gerar um erro. Se a aplicação não buscar todas as linhas de um conjunto de resultados sem buffer, o mysqlnd buscará implicitamente o conjunto de resultados para limpar a linha. Veja também rows_skipped_normal, rows_skipped_ps. Algumas causas possíveis para uma liberação implícita:
  • Aplicação cliente com defeito

  • O cliente parou de ler depois de encontrar o que procurava, mas fez o MySQL calcular mais registros do que o necessário

  • A aplicação cliente parou inesperadamente

ps_prepared_never_executed Conexão Número de instruções preparadas mas nunca executadas. As instruções preparadas ocupam recursos do servidor. Não se deve preparar uma declaração se não se planeja executá-la.
ps_prepared_once_executed Conexão Número de instruções preparadas executadas apenas uma vez. Uma das ideias por trás das instruções preparadas é que a mesma consulta seja executada repetidamente (com parâmetros diferentes) e algum trabalho de análise e preparação possa ser salvo, se a execução da instrução for dividida em estágios separados de preparação e execução. A idéia é preparar uma vez e fazer cache dos resultados, por exemplo, da árvore de análise a ser reutilizada durante a execução de múltiplas instruções. Se uma instrução preparada for executada apenas uma vez, o processamento em dois estágios poderá ser ineficiente em comparação com consultas normais porque todo o armazenamento em cache significa trabalho extra e são necessários recursos (limitados) do servidor para armazenar as informações armazenadas em cache. Conseqüentemente, instruções preparadas que são executadas apenas uma vez podem causar danos ao desempenho.
rows_fetched_from_server_normal, rows_fetched_from_server_ps Conexão Número total de linhas do conjunto de resultados obtidas com sucesso do MySQL, independentemente da aplicação cliente as ter consumido ou não. Algumas das linhas podem não ter sido buscadas pela aplicação cliente, mas podem ter sido liberadas implicitamente. Veja também packets_received_rset_row
rows_buffered_from_client_normal, rows_buffered_from_client_ps Conexão Número total de linhas armazenadas em buffer com êxito originadas de uma consulta "normal" ou de uma instrução preparada. Este é o número de linhas que foram buscadas no MySQL e armazenadas em buffer no cliente. Observe que existem duas estatísticas distintas sobre linhas que foram armazenadas em buffer (MySQL para buffer interno do mysqlnd) e linhas armazenadas em buffer que foram buscadas pela aplicação cliente (buffer interno do mysqlnd para aplicação cliente). Se o número de linhas em buffer for maior que o número de linhas em buffer buscadas, isso pode significar que a aplicação cliente executa consultas que causam conjuntos de resultados maiores do que o necessário, resultando em linhas não lidas pelo cliente. Exemplos de consultas que armazenarão resultados em buffer: mysqli_query(), mysqli_store_result()
rows_fetched_from_client_normal_buffered, rows_fetched_from_client_ps_buffered Conexão Número total de linhas buscadas pelo cliente de um conjunto de resultados em buffer criado por uma consulta "normal" ou uma instrução preparada.  
rows_fetched_from_client_normal_unbuffered, rows_fetched_from_client_ps_unbuffered Conexão Número total de linhas buscadas pelo cliente de um conjunto de resultados sem buffer criado por uma consulta "normal" ou uma instrução preparada.  
rows_fetched_from_client_ps_cursor Conexão Número total de linhas buscadas pelo cliente a partir de um cursor criado por uma instrução preparada.  
rows_skipped_normal, rows_skipped_ps Conexão Reservada para uso futuro (atualmente não suportada)  
copy_on_write_saved, copy_on_write_performed Process Com o mysqlnd, as variáveis ​​retornadas pelas extensões apontam para os buffers de resultados da rede interna do mysqlnd. Se as variáveis não forem alteradas, os dados buscados serão mantidos apenas uma vez na memória. Se as variáveis forem alteradas, o mysqlnd deverá executar uma cópia na gravação para proteger os buffers de resultados da rede interna contra alterações. Com a Biblioteca Cliente MySQL os dados buscados são sempre mantidos duas vezes na memória. Uma vez nos buffers internos da Biblioteca Cliente MySQL e uma vez nas variáveis ​​retornadas pelas extensões. Em teoria, o mysqlnd pode economizar até 40% de memória. Entretanto, observe que a economia de memória não pode ser medida usando memory_get_usage().  
explicit_free_result, implicit_free_result Conexão, Processo (somente durante limpeza de instrução preparada) Número total de conjuntos de resultados liberados. A liberação é sempre considerada explícita exceto para conjuntos de resultados criados por um comando init, por exemplo , 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 Conexão Número total de colunas de um certo tipo buscadas por uma consulta normal (protocolo de texto do MySQL). Mapeamento de tipos API C / metadados MySQL para o nome da estatística:
  • 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

  • Qualquer MYSQL_TYPE_* não listado antes (não deve ter faltado nenhum) - proto_text_fetched_other

Observe que as constantes MYSQL_*-type podem não estar associadas com os mesmos tipos de colunas SQL em todas as versões do MySQL.

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 Conexão Número total de colunas de um certo tipo buscadas por uma instrução preparada (protocolo binário do MySQL). Para mapeamento de tipos, consulte proto_text_* descrito no texto anterior.
Estatísticas retornadas pelo mysqlnd: Conexão
Estatística Escopo Descrição Notas
connect_success, connect_failure Conexão Número total de tentativas de conexão bem sucedidas ou falhadas. Conexões reutilizadas e todos os outros tipos de conexão são incluídos.
reconnect Processo Número total de tentativas de (real_)connect feitas em um identificador de conexão já aberta. A sequência de código $link = new mysqli(...); $link->real_connect(...) causará uma reconexão. Porém, $link = new mysqli(...); $link->connect(...) não causará porque $link->connect(...) irá fechar explicitamente a conexão existente antes que uma nova conexão seja estabelecida.
pconnect_success Conexão Número total de tentativas de conexões persistentes bem sucedidas. Observe que connect_success mantém a soma de tentativas de conexões persistentes e não persistentes. O número de tentativas de conexões não persistentes bem sucedidas é connect_success - pconnect_success.
active_connections Conexão Número total de conexões ativas persistentes e não persistentes.  
active_persistent_connections Conexão Número total de conexões ativas persistentes. O número total de conexões ativas não persistentes é active_connections - active_persistent_connections.
explicit_close Conexão Número total de conexões fechadas explicitamente (somente ext/mysqli). Exemplos de trechos de código que causam um fechamento explícito:
$link = new mysqli(...); $link->close(...)
$link = new mysqli(...); $link->connect(...)
implicit_close Conexão Número total de conexões fechadas implicitamente (somente ext/mysqli). Exemplos de trecho de código que causam um fechamento implícito:
  • $link = new mysqli(...); $link->real_connect(...)

  • unset($link)

  • Conexão persistente: conexão agrupada foi criada com real_connect e pode haver opções desconhecidas definidas - fecha implicitamente para evitar retorno de uma conexão com opções desconhecidas

  • Conexão persistente: ping/change_user falha e ext/mysqli fecha a conexão

  • Fim de execução do script: fecha conexões que não foram fechadas pelo usuário

disconnect_close Conexão Falhas de conexão indicadas pela chamada da API C mysql_real_connect() durante uma tentativa de se estabelecer uma conexão. É chamada de disconnect_close porque o identificador de conexão passado à chamada da API C será fechado.
in_middle_of_command_close Processo Uma conexão foi fechada no meio de uma execução de comando (conjunto de resultados não buscado, após consulta enviada e antes da obtenção de uma resposta, durante busca de dados, enquanto se transfere dados com LOAD DATA). A menos que consultas assíncronas estejam sendo usadas, isto só deve acontecer se o script parar inesperadamente e o PHP fechar as conexões.
init_command_executed_count Conexão Número total de execuções do comando init, por exemplo, mysqli_options(MYSQLI_INIT_COMMAND , ...). O número de execuções bem sucedidas é init_command_executed_count - init_command_failed_count.
init_command_failed_count Conexão Número total de comandos init falhados.  
Estatísticas retornadas pelo mysqlnd: Comando COM_*
Estatística Escopo Descrição Notas
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 Conexão Número total de tentativas de envio de um comando COM_* específico do PHP para o MySQL.

As estatísticas são incrementadas após a verificação da linha e imediatamente antes de enviar o pacote de protocolo cliente-servidor MySQL correspondente. Se o mysqlnd falhar ao enviar o pacote pela rede, as estatísticas não serão decrementadas. Em caso de falha, o mysqlnd emite um alerta do PHP Error while sending %s packet. PID=%d. (Erro ao enviar o pacote %s.)

Exemplos de uso:

  • Verificar se o PHP envia certos comando ao MySQL, por exemplo, verificando se o cliente envia COM_PROCESS_KILL

  • Calcular a média de execução de instruções preparadas comparando-se COM_EXECUTE com COM_PREPARE

  • Verificar se o PHP executou alguma instrução SQL não preparada, verificando se COM_QUERY é zero

  • Identificar os scripts PHP que executam um número excessivo de instruções SQL, verificando COM_QUERY e COM_EXECUTE

Miscelâneos

Estatísticas retornadas pelo mysqlnd: Miscelâneos
Estatística Escopo Descrição Notas
explicit_stmt_close, implicit_stmt_close Processo Número total de fechamento de instruções preparadas. Um fechamento é sempre considerado explícito exceto para uma preparação falhada.
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 Processo Chamadas de gerenciamento de memória. Somente desenvolvimento.
command_buffer_too_small Conexão Número de extensões de buffer de comando de rede ao enviar comandos do PHP para o MySQL.

mysqlnd aloca um buffer de comando/rede interno com tamanho de mysqlnd.net_cmd_buffer_size (php.ini) bytes para cada conexão. Se um comando do protocolo Cliente-Servidor do MySQL, por exemplo, COM_QUERY (consulta normal), não couber no buffer, o mysqlnd aumentará o tamanho do buffer para o que for necessário para enviar o comando. Sempre que o buffer for estendido para uma conexão, command_buffer_too_small será incrementado em uma unidade.

Se o mysqlnd tiver que aumentar o buffer além de seu tamanho inicial em bytes definido em mysqlnd.net_cmd_buffer_size (php.ini) para quase toda conexão, deve-se considerar aumentar o tamanho padrão para evitar realocações.

O tamanho padrão do buffer é de 4096 bytes, que é o menor valor possível. O padrão pode ser alterado através da configuração mysqlnd.net_cmd_buffer_size do php.ini ou usando mysqli_options(MYSQLI_OPT_NET_CMD_BUFFER_SIZE, int size).

connection_reused      
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top