Estadísticas

Usar datos estadísticos

El Controlador Nativo de MySQL soporta la obtención de estadísticas sobre la comunicación entre el cliente y el servidor. Las estadísticas obtenidas son de dos tipos principales:

  • Estadísticas del cliente

  • Estadísticas de conexión

Si se está usando la extensión mysqli, estas estadísticas se pueden obtener a través de dos llamadas a la API:

Nota:

Las estadísticas son acumuladas entre todas las extensiones que usan el Controlador Nativo de MySQL. Por ejemplo, al compilar ext/mysql y ext/mysqli con el Controlador Nativo de MySQL, las llamadas a las funciones de ext/mysql y ext/mysqli cambiarán las estadísticas. No existe ninguna forma de averiguar cuanto ha impactado una cierta llamada a la API de una extensión que ha sido compilada con el Controlador Nativo de MySQL en una cierta estadística. Se puede configurar el Controlador PDO MySQL, ext/mysql y ext/mysqli para que opcionalmente usen el Controlador Nativo de MySQL. Cuando se hace esto, las tres extensiones cambiarán las estadísticas.

Acceder a las estadísticas del cliente

Para acceder a las estadísticas del cliente se necesita llamar a mysqli_get_client_stats(). La llamada a la función no necesita ningún parámetro.

La función devuelve un array asociativo que contiene el nombre de la estadística como clave y los datos de la estadística como valor.

A las estadísticas del cliente también se pueden acceder llamando a la función phpinfo().

Acceder a las estadísticas de conexión

Para acceder a las estadísticas de conexión se ha de llamar a mysqli_get_connection_stats(). Esta toma el gestor de conexión de la base de datos como parámetro.

La función devuelve un array asociativo que contiene el nombre de la estadística como clave y los datos de la estadística como valor.

Conjuntos de resultados almacenados y no almacenados en buffer

Los conjuntos de resultados puede ser almacenados o no almacenados en buffer. Al usar la configuración predeterminada, ext/mysql y ext/mysqli trabajan con conjuntos de resultados almacenados en buffer para consultas normales (sentencia no preparada). Los conjuntos de resultados almacenados en buffer son almacenados en la caché del cliente. Después de la ejecución de una consulta, todos los resultados son traidos desde el Servidor MySQL y almacenados en una caché del cliente. La gran ventaja de los conjuntos de resultados almacenados en buffer es que permiten al servidor liberar todos los recursos asignados a un conjunto de resultados, una vez que los resultados han sido obtenidos por el cliente.

Por otra parte, los conjuntos de resultados no almacenados en buffer se mantienen mucho más tiempo en el servidor. server. Si se quiere reducir el consumo de memoria del cliente, aunque incrementando la carga del servidor, se han de usar conjunto de resultados no almacenados en buffer. Si se experimenta una alta carga del servidor y las cigras de los conjuntos de resultados no almacenados en buffer son altas, se debería considerar trasladar la carga a los cliente. Estos normalmente escalan mejor que los servidores. La carga no solamente se refiere a los buffers de memoria - el servidor también necesita mantener otros recursos abiertos, como por ejemplo, gestores de ficheros e hilos, antes de que un conjunto de resultados sea liberado.

Las Sentencias Preparadas usan conjuntos de resultados no almacenados en buffer de manera predeterminada. Sin embargo, se puede usar mysqli_stmt_store_result() para habilitar los conjuntos de resultados almacenados en buffer.

Estadísticas devueltas por el Controlador Nativo de MySQL

Las siguientes tablas muestran una lista de las estadísticas devueltas por las funciones mysqli_get_client_stats() y mysqli_get_connection_stats().

Estadísticas devueltas de mysqlnd: Red
Estadística Ámbito Descrpción Notas
bytes_sent Conexión Número de bytes enviados desde PHP al servidor MySQL Se puede usar para comprobar la eficiencia del protocolo de compresión
bytes_received Conexión Número de bytes recibidos desde el servidor MySQL Se puede usar para comprobar la eficiencia del protocolo de compresión
packets_sent Conexión Número de paquetes enviados del protocolo Cliente Servidor de MySQL Usado para la depuración de la implementación del protoclo Cliente Servidor
packets_received Conexión Número de paquetes recividos del protocolo Cliente Servidor de MySQL Usado para la depuración de la implementación del protoclo Cliente Servidor
protocol_overhead_in Conexión MySQL Client Server protocol overhead in bytes for incoming traffic. Currently only the Packet Header (4 bytes) is considered as overhead. protocol_overhead_in = packets_received * 4 Used for debugging Client Server protocol implementation
protocol_overhead_out Conexión Carga adicional de protocolo Cliente Servidor de MySQL en bytes para el tráfico saliente. Actualmente, sólo el Paquete de Cabecera (4 bytes) se considera como carga adicional. protocol_overhead_out = packets_sent * 4 Usado para la depuración de la implementación del protoclo Cliente Servidor
bytes_received_ok_packet Conexión Tamaño total en bytes de los paquetes OK recibidos del protocolo Cliente Servidor de MySQL. Los paquetes OK pueden contener un mensaje de estado. La longitud del mensaje de estado puede variar y, por lo tanto, el tamaño del paquete OK no es fijo. Usado para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
packets_received_ok Conexión Número de paquetes OK recibidos del protocolo Cliente Servidor de MySQL. Usado para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
bytes_received_eof_packet Conexión Tamaño total en bytes de los paquetes OEF recibidos del protocolo Cliente Servidor de MySQL. EOF puede variar de tamaño dependiendo de la versión del servidor. También, EOF puede transportar un mensaje de error. Usado para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
packets_received_eof Conexión Número de paquetes EOF del del protocolo Cliente Servidor de MySQL. Al igual que otras estadísticias de paquetes, el número de paquetes se incrementará incluso si PHP no recibe el paquete esperado, sino, por ejemplo, un mensaje de error. Usado para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
bytes_received_rset_header_packet Conexión Tamaño total en bytes de los paquetes de cabecera de conjuntos de resultados del protocolo Cliente Servidor de MySQL. El tamaño de los paquetes varía dependiendo de la carga útil (LOAD LOCAL INFILE, INSERT, UPDATE, SELECT, mensaje de error). Usado para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
packets_received_rset_header Conexión Número de paquetes de cabecera de conjuntos de resultados del protocolo Cliente Servidor de MySQL. Usado para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
bytes_received_rset_field_meta_packet Conexión Tamaño total en bytes de los paquetes de metadatos (información de campos) de conjuntos de resultados del protocolo Cliente Servidor de MySQL. Por supuesto, el tamaño total vaía con los campos del conjunto de resultados. El paquete también puede transportar un error o un paquete EOF en el caso de COM_LIST_FIELDS. Solamente útil para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
packets_received_rset_field_meta Conexión Número de paquetes de metadatos (información de campos) de conjuntos de resultados del protocolo Cliente Servidor de MySQL. Solamente útil para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
bytes_received_rset_row_packet Conexión Tamaño total en bytes de los paquetes de datos de fila de conjuntos de resultados del protocolo Cliente Servidor de MySQL. El paquete también puede transportar un error o un paquete EOF. Se puede obtener el número de error y los paquetes EOF restando rows_fetched_from_server_normal y rows_fetched_from_server_ps de bytes_received_rset_row_packet. Solamente útil para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
packets_received_rset_row Conexión Número de paquetes de datos de fila de conjuntos de datos del protocolo Cliente Servidor de MySQL y su tamaño total en bytes. Solamente útil para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
bytes_received_prepare_response_packet Conexión Tamaño total de los paquetes OK para la Inicialización de Sentencias Preparadas del protocolo Cliente Servidor de MySQL (paquetes init de sentencias preparadas). El paquete también puede transportar un error. El tamaño del paquete depende de la versión de: 9 bytes con MySQL 4.1 y 12 bytes desde MySQL 5.0. No existe una manera segura de conocer cuántos errores han sucedido. Se puede suponer que ha sucedido un error si, por ejemplo, si siempre se conecta a MySQL 5.0 o superior y bytes_received_prepare_response_packet != packets_received_prepare_response * 12. Véase también ps_prepared_never_executed, ps_prepared_once_executed. Solamente útil para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
packets_received_prepare_response Conexión Número de paquetes OK para la Inicialización de Sentencias Preparadas del protocolo Cliente Servidor de MySQL (paquetes init de sentencias preparadas). Solamente útil para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
bytes_received_change_user_packet Conexión Tamaño total en bytes de los paquetes COM_CHANGE_USER del protocolo Cliente Servidor de MySQL. El paquete también puede transportar un error o EOF. Solamente útil para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
packets_received_change_user Conexión Número de paquetes COM_CHANGE_USER del protocolo Cliente Servidor de MySQL Solamente útil para la implementación de protocolo CS. Observe que el tamaño total en bytes incluye el tamaño del paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_*).
packets_sent_command Conexión Número de comandos enviados del protocolo Cliente Servidor de MySQL desde PHP a MySQL. No hay forma de conocer los comandos específicos ni cuántos han sido enviados. En el mejor de los casos, se puede usar para comprobar si PHP ha enviado cualquier comando a MySQL para saber si se puede considerar deshabilitar el soporte para MySQL en el binario de PHP. Tampoco hay forma de obtener el número de errores que pueden haber ocurrido mientras se envían datos a MySQL. El único error que se registra es command_buffer_too_small (véase abajo). Solamente útil para la implementación de protocolo CS.
bytes_received_real_data_normal Conexión Número de bytes de carga útil obtenidos por el cliente de PHP desde mysqlnd usando el protocolo de texto. Es el tamaño de los datos reales contenidos en conjuntos de resultados que no son originados desde sentencias preparadas y que han sido obtenidos por el cliente de PHP. Observe que aunque un conjunto de resultados completo puede haber sido obtenido desde MySQL por mysqlnd, esta estadística únicamente cuenta los datos reales obtenidos desde mysqlnd por el cliente de PHP. Un ejemplo de una secuencia de código que incrementará el valor es el siguiente:
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->fetch_assoc();
$res->close();

Cada operación de obtención incrementará el valor.

La estadística no se incrementará si el conjunto de resultados sólo se almancena en buffer en el cliente, pero no se obtiene, como en el siguiente ejemplo:

$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->close();

Esta estadística está disponible a partir de la versión 5.3.4 de PHP.

bytes_received_real_data_ps Conexión Número de bytes de la carga útil obtenida por el cliente de PHP desde mysqlnd usando el protocolo de sentencias preparadas. Es el tamaño de los datos reales contenidos en conjuntos de resultados que no son originados desde sentencias preparadas y que han sido obtenidos por el cliente de PHP. El valor no será incrementado si el conjunto de resultados no es leído subsiguientemente por el cliente de PHP. Observe que aunque un un conjunto de resultados completo puede haber sido obtenido desde MySQL por mysqlnd, esta estadística únicamente cuenta los datos reales obtenidos desde mysqlnd por el cliente de PHP. Véase también bytes_received_real_data_normal. Esta estadística está disponible a partir de la versión 5.3.4 de PHP.

Conjuntos de Resultados

Estadísticas devueltas de mysqlnd: Conjunto de Resultados
Estadística Ámbito Descrpción Notas
result_set_queries Conexión Número de consultas que han generado un conjunto de resultados. Ejemplos de consultas que generan un conjunto de resultados: SELECT, SHOW. La estadística no será incrementada si hay un error al leer el paquete de cabecera del conjunto de resultados desde la línea. Se puede usar como una medida indirecta del número de consultas que PHP ha enviado a MySQL, por ejemplo, para identificar un cliente que causa una carga alta de base de datos.
non_result_set_queries Conexión Número de consultas que no generan un conjunto de resultados. Ejemplos de consultas que no generan un conjunto de resultados: INSERT, UPDATE, LOAD DATA, SHOW. La estadística no será incrementada si hay un error al leer el paquete de cabecera del conjunto de resultados desde la línea. Se puede usar como una medida indirecta del número de consultas que PHP ha enviado a MySQL, por ejemplo, para identificar un cliente que causa una carga alta de base de datos.
no_index_used Conexión Número de consultas que ha generado un conjunto de resultados pero que no usan un índice (véase también la opción de inicio de mysqld –log-queries-not-using-indexes). Si se desea que estas consultas sean reportadas, se puede usar mysqli_report(MYSQLI_REPORT_INDEX) para hacer que ext/mysqli lance una excepción. Si se prefiere una advertencia en lugar de una excepción, use mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT).  
bad_index_used Conexión Número de consultas que han generado un conjunto de resultados y que no usan un índice bueno (véase también la opción de inicio de mysqld –log-slow-queries). Si se desea que estas consultas sean reportadas, se puede usar mysqli_report(MYSQLI_REPORT_INDEX) para hacer que ext/mysqli lance una excepción. Si se prefiere que se emita una advertencia en lugar de una excepción, use mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT)
slow_queries Conexión Senetencias SQL que toman más de long_query_time segundos para ejecutarse y que requieren al menos min_examined_row_limit filas para ser examinadas. No reportadas a través de mysqli_report()
buffered_sets Conexión Número de conjuntos de resultados almacenados en buffer mediante consultas normales. Normal significa sentencia no preparada en las siguientes notas. Ejemplos de llamada a la API que almacenarán en buffer conjuntos de resultados en el cliente: mysql_query(), mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result(). Al almacenar en buffer conjuntos de resultados en el cliente se asegura que los recursos del servidor sean liberados tan pronto como sea posible y hace que el desplazamiento del conjunto de resultados sea más sencillo. El inconveniente es el consumo adicional de memoria en el cliente para almacenar en buffer datos. Observe que mysqlnd (a diferencia de la Biblioteca Cliente de MySQL) respeta el límite de memoria de PHP debido a que utiliza las funciones de gestión de memoria internas de PHP para asignar memoria. Ésta también es la razón de por qué memory_get_usage() informa de un consumo de memoria al usar mysqlnd en lugar de la Bliblioteca Cliente de MySQL. memory_get_usage() no mide en absoluto el consumo de memoria de la Bliblioteca Cliente de MySQL debido a que ¡la Biblioteca Cliente de MySQL no usa las funciones de gestión de memoria internas de PHP monitorizadas por la función!
unbuffered_sets Conexión Número de conjuntos de resultados no almacenados en buffer devueltos por consultas normales (sentencia no preparada). Ejemplos de llamadas a la API que no almacenan en buffer conjuntos de resultados en el clilente: mysqli_use_result()
ps_buffered_sets Conexión Número de conjuntos de resultados almacenados en buffer devueltos por sentencias preparadas. Por defecto, las sentencias preparadas no se almacenan en buffer. Ejemplos de llamadas a la API que no almacenarán en buffer conjuntos de resultados en el cliente: mysqli_stmt_store_result
ps_unbuffered_sets Conexión Número de conjuntos de resultados no almacenados en buffer devueltos por sentencias preparadas. Por defecto, las sentencias preparadas no se almacenan en buffer.
flushed_normal_sets Conexión Número de conjuntos de resultados de consultas normales (sentencia no preparada) con datos no leídos que han sido volcados de manera silenciosa. El volcado sucede solamente con conjuntos de resultados no almacenados en buffer. Los conjuntos de resultados no almacenados en buffer deben ser obtenidos completamente antes de que una nueva consulta pueda ser ejecutada en la conexión, si no, MySQL lanzará un error. Si la aplicación no obtiene todas las filas de un conjunto de resultados no almacenado en buffer, mysqlnd obtendrá implícitamente el conjunto de resultados para limpiar la línea. Véase también rows_skipped_normal, rows_skipped_ps. Algunas posibles causas de un volcado implícito:
  • Aplicación cliente defectuosa

  • El cliente para de leer después de que encuentre que lo que estaba buscando, pero ha hecho que MySQL calcule más registros que los necesarios

  • La aplicación cliente se ha detenido de improviso

flushed_ps_sets Conexión Número de conjuntos de resultados de sentencias preparadas con datos no leídos que han sido volcados de forma silenciosa. El volcado sucede solamente con conjuntos de resultados no almacenados en buffer. Los conjuntos de resultados no almacenados en buffer deben ser obtenidos completamente antes de que una nueva consulta pueda ser ejecutada en la conexión, si no, MySQL lanzará un error. Si la aplicación no obtiene todas las filas de un conjunto de resultados no almacenado en buffer, mysqlnd obtendrá implícitamente el conjunto de resultados para limpiar la línea. Véase también rows_skipped_normal, rows_skipped_ps. Algunas posibles causas de un volcado implícito:
  • Aplicación cliente defectuosa

  • El cliente para de leer después de que encuentre que lo que estaba buscando, pero ha hecho que MySQL calcule más registros que los necesarios

  • La aplicación cliente se ha detenido de improviso

ps_prepared_never_executed Conexión Número de sentencias preparadas pero nunca ejecutadas. Las sentencias preparadas ocupan recursos del servidor. No se debería preparar una sentencia si no se planea ejecutarla.
ps_prepared_once_executed Conexión Número de sentencias preparadas ejecutadas una única vez. Una de las ideas detrás de las sentencias preparadas es que la misma consulta se ejecuta una y otra vez (con diferentes parámetros) y así se puede ahorrar algo de análisis y otros trabajos de preparación, si la ejecución de la sentencia se divide en diferentes fases de preparación y ejecución. La idea es preparar una vez y almacenar en caché los resultados, por ejemplo, el árbol de análisis a ser reutilizado durante la ejecución de sentencias múltiples. Si se ejecuta una sentencia prearada una sola vez, los dos procesamientos de las fases pueden ser ineficientes comparados con consultas normales, ya que todo el almacenamiento en caché significa trabajo extra y toma recursos (limitados) del servidor para mantener la información almacenada en caché. Consecuentemente, las sentencias preparadas que son ejecutadas una sola vez pueden causar daños al rendimiento.
rows_fetched_from_server_normal, rows_fetched_from_server_ps Conexión Número total de conjuntos de resultados obtenidos con éxito de MySQL sin considerar si la aplicación cliente los ha consumido o no. Algunas filas pueden no haber sido obtenidas por la aplicación cliente aunque hayan sido volcadas implícitamente. Véase también packets_received_rset_row
rows_buffered_from_client_normal, rows_buffered_from_client_ps Conexión Número total de filas almacenadas en buffer con éxito originadas desde una consulta "normal" o una sentencia preparada. Este es el número de filas que han sido obtenidas de MySQL y almacenadas en buffer en el cliente. Observe que existen dos estadísticas distintas de filas que has sido almacenadas en buffer (MySQL al buffer internto de mysqlnd) y filas almacenadas en buffer que han sido obtenidas por la aplicación cliente (buffer interno de mysqlnd a la aplicación cliente). Si el número de filas almacenadas en buffer es mayor que el número de filas almacenadas en buffer obtenidas, puede significar que la aplicación cliente ejecuta consultas que originan conjuntos de resultados grandes que necesitan resultar en filas no leídas por el cliente. Ejemplos de consultas que almacenarán en buffer resultados: mysqli_query(), mysqli_store_result()
rows_fetched_from_client_normal_buffered, rows_fetched_from_client_ps_buffered Conexión Número total de filas obtenidas por el cliente desde un conjunto de resultados almacenado en buffer creado por una consulta normal o una sentencia preparada.  
rows_fetched_from_client_normal_unbuffered, rows_fetched_from_client_ps_unbuffered Conexión Número total de filas obtenidas por el cliente desde un conjunto de resultados no almacenado en buffer creado por una consulta "normal" o una sentencia no preparada.  
rows_fetched_from_client_ps_cursor Conexión Número total de filas obtenidas por el cliente desde un cursor creado por una sentencia preparada.  
rows_skipped_normal, rows_skipped_ps Conexión Reservado para un uso futuro (actualmente no soportado)  
copy_on_write_saved, copy_on_write_performed Proceso Con mysqlnd, las variables devueltas por las extensiones apuntan a los buffers de resultados de red internos de mysqlnd. Si no se cambian las variables, los datos obtenidos serán conservados en memoria una sola vez. Si se cambian las variables, mysqlnd tiene que realizar una copia mientras se escribe para proteger los buffers de resultados de red internos de ser cambiados. Con la Biblioteca Clientes de MySQL siempre se conservan dos veces en memoria los datos obtenidos. Una en los buffers internos de la Biblioteca Cliente de MySQL y otra en las variables devueltas por las extensiones. En teoría, mysqlnd puede ahorrar hasta un 40% de memoria, Sin embargo, observe que el ahorro de memoria no puede ser medido usando memory_get_usage().  
explicit_free_result, implicit_free_result Conexión, Processo (sólo durante la limpieza de sentencias preparadas) Número de total de conjuntos de resultados liberados. La liberación es considerada siempres explícita excepto para conjuntos de resultados creados por un comando init, por ejemplo, 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 Conexión Número total de columnas de un cierto tipo obtenidas de una consulta normal (protocolo de texto de MySQL). Referencia de los tipos de metadatos de la API de C / MySQL para el nombre de la estadí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

  • Any MYSQL_TYPE_* no listado antes (no debería ser ninguno) - proto_text_fetched_other

Observe que las constantes MYSQL_*-type pueden no estar asociadas con los mismos tipos de columnas SQL en cada versión de 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 Conexión Número total de columnas de un cierto tipo obtenidas desde una sentencia preparada (protocolo binario de MySQL). Para la referenciacición de tipos, véase proto_text_* descrito en el texto anterior.
Estadísticas devueltas de mysqlnd: Conexión
Estadística Ámbito Descrpción Notas
connect_success, connect_failure Conexión Número total de intentos de conexión con éxito/falladas. Están incluidas las conexiones rechazadas y los demás tipos de conexiones.
reconnect Proceso Número total de intentos de conexión verdadera (real_) hechas sobre un gestor de conexión ya abierto. La secuencia de código $enlace = new mysqli(...); $enlace->real_connect(...) ocasionará una reconexión. Pero $link = new mysqli(...); $enlace->connect(...) no lo hará ya que $enlca->connect(...) cerrará explícitamente la conexión existente antes de que se establezca una nueva conexión.
pconnect_success Conexión Número total de intentos de conexión persistente realizados con éxito. Observe que connect_success contiene la suma de intentos de conexión persistente y no persistente realizados con éxito. El número de intentos de conexión no persistente realizados con éxito es connect_success - pconnect_success.
active_connections Conexión Número total de conexiones persistentes y no persistentes activas.  
active_persistent_connections Conexión Número de conexiones persistentes activas. El número total de conexiones no persistentes activas es active_connections - active_persistent_connections.
explicit_close Conexión Número total de conexiones cerradas explícitamente (sólo ext/mysqli). Ejemplos de trozos de código que causan un cierre explícito :
$enlace = new mysqli(...); $enlace->close(...)
$enlace = new mysqli(...); $enlace->connect(...)
implicit_close Conexión Número total de conexiones cerradas implícitamente (sólo ext/mysqli). Ejemplos de trozos de código que causan un cierre implícito :
  • $enlace = new mysqli(...); $enlace->real_connect(...)

  • unset($enlace)

  • Conexión persistente: conexión almacenada en caché que ha sido creada con real_connect y que puede poseer un conjunto de opciones desconocidas - cerrar implícitamente para evitar devolver una conexión con opciones desconocidas

  • Conexión persistente: ping/change_user falla y ext/mysqli cierra la conexión

  • fin de la ejecución de un script: cierra la conexiones que no han sido cerradas por el usuario

disconnect_close Conexión Fallos de conexión indicados por la llamada a la API en C de mysql_real_connect() durante un intento de establecer una conexión. Es llamada disconnect_close porque el gestor de conexión pasado a la llamada a la API en C será cerrado.
in_middle_of_command_close Proceso Una conexión ha sido cerrada en mitad de la ejecución de un comando (conjuntos de resultados pendientes no obtenidos, después de enviar una consulta y antes de obtener una respuesta, mientras se obtienen los datos, mientras se transfieren datos con LOAD DATA). A menos que se usen consultas asíncronas, esto únicamente debería ocurrir si el script se detiene inesperadamente y PHP cierra las conexiones por sí solo.
init_command_executed_count Conexión Número totas de ejecuciones de comandos init, por ejemplo, mysqli_options(MYSQLI_INIT_COMMAND , ...). El número de ejecuciones realizadas con éxito es init_command_executed_count - init_command_failed_count.
init_command_failed_count Conexión Número total de comnados init fallados.  
Estadísticas devueltas de mysqlnd: Comando COM_*
Estadística Ámbito Descrpción 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 Conexión Número total de intentos de enviar un cierto comando COM_* desde PHP a MySQL.

Las estadísticas son incrementadas después de comprobar la línea e inmediatamente antes de enviar el paquete de protocolo cliente-servidor de MySQL correspondiente. Si mysqlnd falla al enviar el paquete sobre el cable, las estadísticas no serán incrementadas. En case de fallo, mysqlnd emite una advertencia de PHP Error while sending %s packet. PID=%d.

Ejemplos de uso:

  • Comprobar si PHP eviía ciertos comandos a MySQL, por ejemplo, comprobar si un cliente envía COM_PROCESS_KILL

  • Calcuar el promedio de ejecuciones de sentencias preparadas comparando COM_EXECUTE con COM_PREPARE

  • Comprobar si PHP ha ejecuato cualquier sentencia SQL no preparada comprobando si COM_QUERY es cero

  • Identificar los scripts de PHP que ejecutan un número excesivo de sentencias SQL comprobando COM_QUERY y COM_EXECUTE

Miscelánea

Estadísticas devueltas de mysqlnd: Miscelánea
Estadística Ámbito Descrpción Notas
explicit_stmt_close, implicit_stmt_close Proceso Número total de sentencias preparadas cerradas. Un cierre siempre es considerado explícito excepto para una preparación fallida.
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 Proceso Llamadas de gestión de memoria. Solamente desarrollo.
command_buffer_too_small Conexión Número de extensiones de buffer de comandos de red mientras se envían comando desde PHP a MySQL.

mysqlnd asigna un buffer de comandos/red interno de mysqlnd.net_cmd_buffer_size (php.ini) bytes para cada conexión. Si un comando del protocolo Cliente Servidor de MySQL, por ejemplo, COM_QUERY (consulta normal), no se ajusta al buffer, mysqlnd will aumentará el buffer lo que sea necesario para enviar el comando. Siempre que el buffer se extienda para una conexión, command_buffer_too_small será incrementado en uno.

Si mysqlnd tiene que aumentar el buffer más allá de su tamaño inicial de mysqlnd.net_cmd_buffer_size (php.ini) bytes para casi todas las conexiones, se debería considerar aumentar el tamaño predeterminado para evitar reasignaciones.

El tamaño predeterminado del buffer es de 2048 bytes en PHP 5.3.0. En futuras versiones, el tamaño predeterminado serán de 4kB o más. Se puede cambiar el valor predeterminado a través de php.ini estableciendo mysqlnd.net_cmd_buffer_size o usando mysqli_options(MYSQLI_OPT_NET_CMD_BUFFER_SIZE, int tamaño).

Se recomienda establecer el tamaño de buffer a no menos de 4096 bytes debido a que mysqlnd también lo utiliza al leer ciertos paquete de comunicación desde MySQL. En PHP 5.3.0, mysqlnd no aumentará el buffer si MySQL envía un paquete que es más grande que el tamaño actual del buffer. Como consecuencia, mysqlnd no es capaz de decodificar el paquete y la aplicación cliente obtendrá un error. Solamente hay dos situacioines en las que un paquete es más grande que los 2048 bytes predeterminados de mysqlnd.net_cmd_buffer_size en PHP 5.3.0: el paquete transporta un mensaje de error muy grande, o el paquete contiene los metadatos de columnas de COM_LIST_FIELD (mysql_list_fields()) y los metadatos provienen de una columna de cadena con un valor predeterminado muy grande (>1900 bytes). No existe reporte de errores sobre esto - debería ocurrir raramente.

A partir de PHP 5.3.2, mysqlnd no permite establecer buffers menores que 4096 bytes.

connection_reused