# 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:

- mysqli_get_client_stats()

- mysqli_get_connection_stats()

> 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 | Descripció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 | Carga adicional de protocolo Cliente Servidor de MySQL en bytes para el tráfico entrante. Actualmente, sólo el Paquete de Cabecera (4 bytes) se considera como carga adicional. protocol_overhead_in = packets_received * 4 | Usado para la depuración de la implementación del protoclo Cliente Servidor
`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 | Descripció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 Todos los `MYSQL_TYPE_*` no listados 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 | Descripció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 | Descripció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 | Descripció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` |  |  |