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_sentbytes_receivedpackets_sentpackets_receivedprotocol_overhead_inprotocol_overhead_in = packets_received * 4
protocol_overhead_outprotocol_overhead_out = packets_received * 4
bytes_received_ok_packetNota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_okbytes_received_eof_packetNota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_eofbytes_received_rset_header_packetLOAD 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_headerbytes_received_rset_field_meta_packetNota: 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_metabytes_received_rset_row_packetrows_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_rowbytes_received_prepare_response_packetNota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_prepare_responsebytes_received_change_user_packetNota: El tamaño total en bytes incluye el tamaño del encabezado del paquete (4 bytes, ver la sobrecarga del protocolo).
packets_received_change_userpackets_sent_commandbytes_received_real_data_normalmysqlnd 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_psmysqlnd 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_queriesSELECT, 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_queriesINSERT, 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_querieslong_query_time
segundos para ejecutarse y han necesitado al menos
min_examined_row_limit filas para examinar.
No reportado mediante mysqli_report().
buffered_setsEjemplos 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_setsEjemplos de llamadas API que no almacenarán en búfer los conjuntos de resultados en el cliente: mysqli_use_result()
ps_buffered_setsEjemplos de llamadas API que almacenarán en búfer los conjuntos de resultados en el cliente: mysqli_stmt_store_result()
ps_unbuffered_setsflushed_normal_setsNota: 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_setsNota: 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_executedps_prepared_once_executedrows_fetched_from_server_normalrows_fetched_from_server_pspackets_received_rset_row.
rows_buffered_from_client_normalEjemplos de consultas que almacenarán en búfer los conjuntos de resultados:
rows_buffered_from_client_psrows_buffered_from_client_normal
pero para las declaraciones preparadas.
rows_fetched_from_client_normal_bufferedrows_fetched_from_client_ps_bufferedrows_fetched_from_client_normal_unbufferedrows_fetched_from_client_ps_unbufferedrows_fetched_from_client_ps_cursorrows_skipped_normalrows_skipped_pscopy_on_write_savedcopy_on_write_performedexplicit_free_resultimplicit_free_resultproto_text_fetched_nullMYSQL_TYPE_NULL
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_nullMYSQL_TYPE_NULL
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_bitMYSQL_TYPE_BIT
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_bitMYSQL_TYPE_BIT
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_tinyintMYSQL_TYPE_TINY
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_tinyintMYSQL_TYPE_TINY
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_shortMYSQL_TYPE_SHORT
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_shortMYSQL_TYPE_SHORT
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_int24MYSQL_TYPE_INT24
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_int24MYSQL_TYPE_INT24
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_intMYSQL_TYPE_LONG
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_intMYSQL_TYPE_LONG
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_bigintMYSQL_TYPE_LONGLONG
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_bigintMYSQL_TYPE_LONGLONG
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_decimalMYSQL_TYPE_DECIMAL, o MYSQL_TYPE_NEWDECIMAL
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_decimalMYSQL_TYPE_DECIMAL, o MYSQL_TYPE_NEWDECIMAL
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_floatMYSQL_TYPE_FLOAT
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_floatMYSQL_TYPE_FLOAT
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_doubleMYSQL_TYPE_DOUBLE
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_doubleMYSQL_TYPE_DOUBLE
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_dateMYSQL_TYPE_DATE, o MYSQL_TYPE_NEWDATE
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_dateMYSQL_TYPE_DATE, o MYSQL_TYPE_NEWDATE
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_yearMYSQL_TYPE_YEAR
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_yearMYSQL_TYPE_YEAR
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_timeMYSQL_TYPE_TIME
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_timeMYSQL_TYPE_TIME
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_datetimeMYSQL_TYPE_DATETIME
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_datetimeMYSQL_TYPE_DATETIME
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_timestampMYSQL_TYPE_TIMESTAMP
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_timestampMYSQL_TYPE_TIMESTAMP
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, or MYSQL_TYPE_VARCHAR
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, or MYSQL_TYPE_VARCHAR
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
o MYSQL_TYPE_BLOB
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_blobMYSQL_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_enumMYSQL_TYPE_ENUM
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_enumMYSQL_TYPE_ENUM
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_setMYSQL_TYPE_SET
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_setMYSQL_TYPE_SET
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_geometryMYSQL_TYPE_GEOMETRY
recuperadas desde una consulta normal (protocolo de texto MySQL).
proto_binary_fetched_geometryMYSQL_TYPE_GEOMETRY
recuperadas desde una declaración preparada (protocolo binario MySQL).
proto_text_fetched_otherMYSQL_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_otherMYSQL_TYPE_*
no listados anteriormente
recuperadas desde una declaración preparada (protocolo binario MySQL).
Nota: En teoría, esto debería ser siempre
0.
connect_successNota:
connect_successcontiene 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_successconnect_failurereconnectactive_connectionsNota: El número total de conexiones no persistentes activas es
active_connections - active_persistent_connections.
active_persistent_connectionsexplicit_closeEjemplo #1 Ejemplos de fragmentos de código que provocan un cierre explícito
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_closeEjemplo #2 Ejemplos de fragmentos de código que provocan un cierre implícito
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_closemysql_real_connect durante un intento de
establecer una conexión.
in_middle_of_command_closeA 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_countmysqli_options(MYSQLI_INIT_COMMAND , $value).
El número de ejecuciones exitosas es
init_command_executed_count - init_command_failed_count.
init_command_failed_countCOM_*
com_quitcom_init_dbcom_querycom_field_listcom_create_dbcom_drop_dbcom_refreshcom_shutdowncom_statisticscom_process_infocom_connectcom_process_killcom_debugcom_pingcom_timecom_delayed_insertcom_change_usercom_binlog_dumpcom_table_dumpcom_connect_outcom_register_slavecom_stmt_preparecom_stmt_executecom_stmt_send_long_datacom_stmt_closecom_stmt_resetcom_stmt_set_optioncom_stmt_fetchcom_daemonCOM_* 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_closeimplicit_stmt_closeNota: 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_countmem_emalloc_ammountmem_ecalloc_countmem_ecalloc_ammountmem_realloc_countmem_realloc_ammountmem_efree_countmem_malloc_countmem_malloc_ammountmem_calloc_countmem_calloc_ammountmem_ealloc_countmem_ealloc_ammountmem_free_countcommand_buffer_too_smallCOM_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