El controlador nativo de MySQL contiene soporte para la recolección de estadísticas sobre la comunicación entre el cliente y el servidor. Las estadísticas recolectadas son de dos tipos principales:
Cuando se utiliza la extensión mysqli, estas estadísticas pueden obtenerse mediante dos llamadas API:
Nota: Las estadísticas se agrupan entre todas las extensiones que utilizan el controlador nativo de MySQL. Por ejemplo, si la extensión mysqli y el controlador PDO MySQL están ambos configurados para usar MySQLnd, entonces las llamadas de funciones de mysqli y las llamadas de métodos de PDO afectarán las estadísticas. No hay manera de saber cuánto impacto ha tenido una cierta llamada API de una extensión que ha sido compilada sin el controlador nativo de MySQL en una cierta estadística.
Las estadísticas del cliente pueden recuperarse llamando a la función mysqli_get_client_stats().
Las estadísticas de conexión pueden recuperarse llamando a la función mysqli_get_connection_stats().
Las dos funciones devuelven un array asociativo, donde el nombre de una estadística es la clave para los datos estadísticos correspondientes.
La mayoría de las estadísticas están asociadas a una conexión, pero algunas están asociadas al proceso, en cuyo caso esto será mencionado.
Las siguientes estadísticas son producidas por el controlador nativo de MySQL:
bytes_sent
bytes_received
packets_sent
packets_received
protocol_overhead_in
protocol_overhead_in = packets_received * 4
protocol_overhead_out
protocol_overhead_out = packets_received * 4
bytes_received_ok_packet
Nota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_ok
bytes_received_eof_packet
Nota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_eof
bytes_received_rset_header_packet
LOAD LOCAL INFILE
, INSERT
,
UPDATE
, SELECT
, mensaje de error).
Nota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_rset_header
bytes_received_rset_field_meta_packet
Nota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_rset_field_meta
bytes_received_rset_row_packet
rows_fetched_from_server_normal
y rows_fetched_from_server_ps
de bytes_received_rset_row_packet
.
Nota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_rset_row
bytes_received_prepare_response_packet
Nota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_prepare_response
bytes_received_change_user_packet
Nota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_change_user
packets_sent_command
bytes_received_real_data_normal
mysqlnd
usando el protocolo de texto.
Esto es el tamaño de los datos reales contenidos en los conjuntos de resultados
que no provienen de declaraciones preparadas y que han sido recuperados por el cliente PHP.
Es de notar que aunque un conjunto de resultados completo haya podido ser extraído de MySQL
por mysqlnd
, esta estadística solo cuenta los datos reales
extraídos de mysqlnd
por el cliente PHP.
Un ejemplo de secuencia de código que incrementará el valor es el siguiente:
$mysqli = new mysqli(); $res = $mysqli->query("SELECT 'abc'"); $res->fetch_assoc(); $res->close();
Sin embargo, la estadística no será incrementada si el conjunto de resultados es solo almacenado en búfer en el cliente, pero no extraído, como en el siguiente ejemplo:
$mysqli = new mysqli(); $res = $mysqli->query("SELECT 'abc'"); $res->close();
bytes_received_real_data_ps
mysqlnd
usando el protocolo de declaración preparada.
Esto es el tamaño de los datos reales contenidos en los conjuntos de resultados
que provienen de declaraciones preparadas y que han sido recuperados por el cliente PHP.
El valor no será incrementado si el conjunto de resultados no es leído por el cliente PHP.
Es de notar que aunque un conjunto de resultados completo haya podido ser extraído de MySQL
por mysqlnd
, esta estadística solo cuenta los datos reales
extraídos de mysqlnd
por el cliente PHP.
Ver también bytes_received_real_data_normal
.
result_set_queries
SELECT
, SHOW
.
La estadística no será incrementada si hay un error al leer
el encabezado del paquete del conjunto de resultados.
Nota: Esta estadística puede ser utilizada como medida indirecta del número de Esto puede ayudar a identificar un cliente que provoca una carga alta en la base de datos. consultas que PHP ha enviado a MySQL.
non_result_set_queries
INSERT
, UPDATE
, LOAD DATA
.
Esta estadística no será incrementada si hay un error al leer
el encabezado del paquete del conjunto de resultados.
Nota: Esta estadística puede ser utilizada como medida indirecta del número de Esto puede ayudar a identificar un cliente que provoca una carga alta en la base de datos. consultas que PHP ha enviado a MySQL.
no_index_used
--log-queries-not-using-indexes
).
Nota: Estas consultas pueden ser reportadas mediante una excepción llamando
mysqli_report(MYSQLI_REPORT_INDEX);
. Es posible reportarlas mediante un aviso llamandomysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);
.
bad_index_used
--log-slow-queries
).
Nota: Estas consultas pueden ser reportadas mediante una excepción llamando
mysqli_report(MYSQLI_REPORT_INDEX);
. Es posible reportarlas mediante un aviso llamandomysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);
.
slow_queries
long_query_time
segundos para ejecutarse y han necesitado al menos
min_examined_row_limit
filas para examinar.
No reportado mediante mysqli_report().
buffered_sets
Ejemplos de llamadas API que almacenarán en búfer los conjuntos de resultados en el cliente: mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_sets
Ejemplos de llamadas API que no almacenarán en búfer los conjuntos de resultados en el cliente: mysqli_use_result()
ps_buffered_sets
Ejemplos de llamadas API que almacenarán en búfer los conjuntos de resultados en el cliente: mysqli_stmt_store_result()
ps_unbuffered_sets
flushed_normal_sets
Nota: El vaciado solo ocurre con conjuntos de resultados no almacenados en búfer. Los conjuntos de resultados no almacenados en búfer deben ser recuperados completamente antes de que una nueva consulta pueda ser ejecutada en la conexión, de lo contrario MySQL lanzará un error. Si la aplicación no recupera todas las filas de un conjunto de resultados no almacenado en búfer, mysqlnd recupera implícitamente el conjunto de resultados para vaciar la fila. Ver también
rows_skipped_normal
,rows_skipped_ps
.Algunas causas posibles para un vaciado implícito:
- Aplicación cliente defectuosa
- Cliente se detuvo de leer después de encontrar lo que buscaba pero hizo que MySQL calculara más filas de las necesarias
- La aplicación cliente se detuvo de manera inesperada
flushed_ps_sets
Nota: El vaciado solo ocurre con conjuntos de resultados no almacenados en búfer. Los conjuntos de resultados no almacenados en búfer deben ser recuperados completamente antes de que una nueva consulta pueda ser ejecutada en la conexión, de lo contrario MySQL lanzará un error. Si la aplicación no recupera todas las filas de un conjunto de resultados no almacenado en búfer, mysqlnd recupera implícitamente el conjunto de resultados para vaciar la fila. Ver también
rows_skipped_normal
,rows_skipped_ps
.Algunas causas posibles para un vaciado implícito:
- Aplicación cliente defectuosa
- Cliente se detuvo de leer después de encontrar lo que buscaba pero hizo que MySQL calculara más filas de las necesarias
- La aplicación cliente se detuvo de manera inesperada
ps_prepared_never_executed
ps_prepared_once_executed
rows_fetched_from_server_normal
rows_fetched_from_server_ps
packets_received_rset_row
.
rows_buffered_from_client_normal
Ejemplos de consultas que almacenarán en búfer los conjuntos de resultados:
rows_buffered_from_client_ps
rows_buffered_from_client_normal
pero para las declaraciones preparadas.
rows_fetched_from_client_normal_buffered
rows_fetched_from_client_ps_buffered
rows_fetched_from_client_normal_unbuffered
rows_fetched_from_client_ps_unbuffered
rows_fetched_from_client_ps_cursor
rows_skipped_normal
rows_skipped_ps
copy_on_write_saved
copy_on_write_performed
explicit_free_result
implicit_free_result
proto_text_fetched_null
MYSQL_TYPE_NULL
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_null
MYSQL_TYPE_NULL
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_bit
MYSQL_TYPE_BIT
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_bit
MYSQL_TYPE_BIT
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_tinyint
MYSQL_TYPE_TINY
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_tinyint
MYSQL_TYPE_TINY
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_short
MYSQL_TYPE_SHORT
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_short
MYSQL_TYPE_SHORT
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_int24
MYSQL_TYPE_INT24
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_int24
MYSQL_TYPE_INT24
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_int
MYSQL_TYPE_LONG
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_int
MYSQL_TYPE_LONG
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_bigint
MYSQL_TYPE_LONGLONG
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_bigint
MYSQL_TYPE_LONGLONG
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_decimal
MYSQL_TYPE_DECIMAL
, o MYSQL_TYPE_NEWDECIMAL
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_decimal
MYSQL_TYPE_DECIMAL
, o MYSQL_TYPE_NEWDECIMAL
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_float
MYSQL_TYPE_FLOAT
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_float
MYSQL_TYPE_FLOAT
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_double
MYSQL_TYPE_DOUBLE
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_double
MYSQL_TYPE_DOUBLE
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_date
MYSQL_TYPE_DATE
, o MYSQL_TYPE_NEWDATE
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_date
MYSQL_TYPE_DATE
, o MYSQL_TYPE_NEWDATE
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_year
MYSQL_TYPE_YEAR
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_year
MYSQL_TYPE_YEAR
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_time
MYSQL_TYPE_TIME
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_time
MYSQL_TYPE_TIME
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_datetime
MYSQL_TYPE_DATETIME
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_datetime
MYSQL_TYPE_DATETIME
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
, or MYSQL_TYPE_VARCHAR
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
, or MYSQL_TYPE_VARCHAR
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_blob
MYSQL_TYPE_TINY_BLOB
,
MYSQL_TYPE_MEDIUM_BLOB
,
o MYSQL_TYPE_BLOB
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_blob
MYSQL_TYPE_TINY_BLOB
,
MYSQL_TYPE_MEDIUM_BLOB
,
MYSQL_TYPE_LONG_BLOB
,
o MYSQL_TYPE_BLOB
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_enum
MYSQL_TYPE_ENUM
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_enum
MYSQL_TYPE_ENUM
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_set
MYSQL_TYPE_SET
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_set
MYSQL_TYPE_SET
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_geometry
MYSQL_TYPE_GEOMETRY
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_geometry
MYSQL_TYPE_GEOMETRY
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_other
MYSQL_TYPE_*
no listados anteriormente
recuperadas desde una consulta normal (protocolo de texto MySQL).
Nota: En teoría, esto debería ser siempre
0
.
proto_binary_fetched_other
MYSQL_TYPE_*
no listados anteriormente
recuperadas desde una declaración preparada (protocolo binario MySQL).
Nota: En teoría, esto debería ser siempre
0
.
connect_success
Nota:
connect_success
contiene la suma de los intentos de conexión persistentes y no persistentes exitosos. Por lo tanto, el número de intentos de conexión no persistentes exitosos esconnect_success - pconnect_success
.
pconnect_success
connect_failure
reconnect
active_connections
Nota: El número total de conexiones no persistentes activas es
active_connections - active_persistent_connections
.
active_persistent_connections
explicit_close
Ejemplo #1 Ejemplos de fragmentos de código que provocan un cierre explícito
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_close
Ejemplo #2 Ejemplos de fragmentos de código que provocan un cierre implícito
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_close
mysql_real_connect
durante un intento de
establecer una conexión.
in_middle_of_command_close
A menos que se usen consultas asíncronas, esto solo debería ocurrir si la aplicación PHP terminó inesperadamente y PHP cierra automáticamente la conexión.
init_command_executed_count
mysqli_options(MYSQLI_INIT_COMMAND , $value)
.
El número de ejecuciones exitosas es
init_command_executed_count - init_command_failed_count
.
init_command_failed_count
COM_*
com_quit
com_init_db
com_query
com_field_list
com_create_db
com_drop_db
com_refresh
com_shutdown
com_statistics
com_process_info
com_connect
com_process_kill
com_debug
com_ping
com_time
com_delayed_insert
com_change_user
com_binlog_dump
com_table_dump
com_connect_out
com_register_slave
com_stmt_prepare
com_stmt_execute
com_stmt_send_long_data
com_stmt_close
com_stmt_reset
com_stmt_set_option
com_stmt_fetch
com_daemon
COM_*
de PHP a MySQL.
La estadística es incrementada después de verificar la línea y justo
antes de enviar el paquete de protocolo cliente-servidor MySQL correspondiente.
Si MySQLnd falla al enviar el paquete en la red, las estadísticas no serán decrementadas.
En caso de fallo, MySQLnd emite un aviso PHP
Error while sending %s packet. PID=%d.
Ejemplo #3 Ejemplos de uso
Verificar si PHP envía ciertos comandos a MySQL, por ejemplo,
verificar si un cliente envía COM_PROCESS_KILL
Calcular el número promedio de ejecuciones de comandos preparados
comparando COM_EXECUTE
con
COM_PREPARE
Verificar si PHP ha ejecutado declaraciones SQL no preparadas
verificando si COM_QUERY
es cero
Identificar los scripts PHP que ejecutan un número excesivo de declaraciones SQL
verificando COM_QUERY
y
COM_EXECUTE
explicit_stmt_close
implicit_stmt_close
Nota: Una declaración preparada siempre es cerrada explícitamente. La única vez que es cerrada implícitamente es cuando su preparación falla.
mem_emalloc_count
mem_emalloc_ammount
mem_ecalloc_count
mem_ecalloc_ammount
mem_realloc_count
mem_realloc_ammount
mem_efree_count
mem_malloc_count
mem_malloc_ammount
mem_calloc_count
mem_calloc_ammount
mem_ealloc_count
mem_ealloc_ammount
mem_free_count
command_buffer_too_small
COM_QUERY
(consulta normal),
no cabe en el búfer,
MyQSLnd extenderá el búfer a lo que sea necesario para enviar el comando.
Cada vez que el búfer es extendido para una conexión
command_buffer_too_small
será incrementado en uno.
Si mysql es obligado a hacer crecer el búfer más allá de su tamaño inicial de
mysqlnd.net_cmd_buffer_size
bytes para casi cada conexión,
se deberían considerar aumentar el tamaño por defecto para evitar
las reasignaciones.
connection_reused