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:
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, si la extensión mysqli y el controlador PDO MySQL están configurados para usar MySQLnd, entonces las llamadas de función de mysqli y las llamadas de método de PDO afectarán las estadísticas. No hay forma de averiguar cuánto ha impactado en una estadística determinada una llamada específica a la API de cualquier extensión que haya sido compilada contra el controlador nativo de MySQL.
Para acceder a las estadísticas del cliente se necesita llamar a mysqli_get_client_stats().
Para acceder a las estadísticas de conexión se ha de llamar a mysqli_get_connection_stats().
Ambas funciones devuelven un array asociativo, el cual contiene el nombre de la estadística como clave y los datos de la estadística como valor.
Most statistics are associated to a connection, but some are associated to the process in which case this will be mentioned.
The following statistics are produced by the MySQL Native Driver:
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 paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_).
packets_received_okbytes_received_eof_packetNota: 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_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 paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_).
packets_received_rset_headerbytes_received_rset_field_meta_packetNota: 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_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 paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_).
packets_received_rset_rowbytes_received_prepare_response_packetNota: 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_responsebytes_received_change_user_packetNota: 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_userpackets_sent_commandbytes_received_real_data_normalmysqlnd 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();
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();
bytes_received_real_data_psmysqlnd 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.
result_set_queriesSELECT, 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.
línea
Nota: Esta estadística puede ser usada como una medida indirecta del número de consultas que PHP ha enviado a MySQL, Esto podría ayudar a identificar un cliente que causa una alta carga en la base de datos.
non_result_set_queriesINSERT, UPDATE, LOAD DATA.
La estadística no será incrementada si hay un error al leer el
paquete de cabecera del conjunto de resultados desde la línea.
Nota: Esta estadística puede ser usada como una medida indirecta del número de consultas que PHP ha enviado a MySQL, Esto podría ayudar a identificar un cliente que causa una alta carga en la base de datos.
no_index_used--log-queries-not-using-indexes).
Nota: Si se desea que estas consultas sean reportadas, se puede usar
mysqli_report(MYSQLI_REPORT_INDEX);. Si se prefiere una advertencia en lugar de una excepción, usemysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);.
bad_index_used--log-slow-queries).
Nota: Si se desea que estas consultas sean reportadas, se puede usar
mysqli_report(MYSQLI_REPORT_INDEX);. Si se prefiere una advertencia en lugar de una excepción, usemysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);.
slow_querieslong_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_setsEjemplos de llamadas a la API que almacenarán en búfer conjuntos de resultados en el cliente: mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_setsEjemplos de llamadas a la API que no almacenan en buffer conjuntos de resultados en el cliente: mysqli_use_result()
ps_buffered_setsEjemplos de llamadas a la API que no almacenarán en buffer conjuntos de resultados en el cliente: mysqli_stmt_store_result()
ps_unbuffered_setsflushed_normal_setsNota: 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_setsNota: 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_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 buffer resultados:
rows_buffered_from_server_psrows_buffered_from_client_normal
pero para sentencias 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
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_nullMYSQL_TYPE_NULL
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_bitMYSQL_TYPE_BIT
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_bitMYSQL_TYPE_BIT
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_tinyintMYSQL_TYPE_TINY
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_tinyintMYSQL_TYPE_TINY
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_shortMYSQL_TYPE_SHORT
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_shortMYSQL_TYPE_SHORT
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_int24MYSQL_TYPE_INT24
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_int24MYSQL_TYPE_INT24
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_intMYSQL_TYPE_LONG
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_intMYSQL_TYPE_LONG
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_bigintMYSQL_TYPE_LONGLONG
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_bigintMYSQL_TYPE_LONGLONG
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_decimalMYSQL_TYPE_DECIMAL, or MYSQL_TYPE_NEWDECIMAL
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_decimalMYSQL_TYPE_DECIMAL, or MYSQL_TYPE_NEWDECIMAL
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_floatMYSQL_TYPE_FLOAT
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_floatMYSQL_TYPE_FLOAT
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_doubleMYSQL_TYPE_DOUBLE
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_doubleMYSQL_TYPE_DOUBLE
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_dateMYSQL_TYPE_DATE, or MYSQL_TYPE_NEWDATE
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_dateMYSQL_TYPE_DATE, or MYSQL_TYPE_NEWDATE
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_yearMYSQL_TYPE_YEAR
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_yearMYSQL_TYPE_YEAR
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_timeMYSQL_TYPE_TIME
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_timeMYSQL_TYPE_TIME
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_datetimeMYSQL_TYPE_DATETIME
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_datetimeMYSQL_TYPE_DATETIME
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_timestampMYSQL_TYPE_TIMESTAMP
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_timestampMYSQL_TYPE_TIMESTAMP
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, or MYSQL_TYPE_VARCHAR
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, or MYSQL_TYPE_VARCHAR
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
MYSQL_TYPE_LONG_BLOB,
or MYSQL_TYPE_BLOB
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
MYSQL_TYPE_LONG_BLOB,
or MYSQL_TYPE_BLOB
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_enumMYSQL_TYPE_ENUM
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_enumMYSQL_TYPE_ENUM
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_setMYSQL_TYPE_SET
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_setMYSQL_TYPE_SET
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_geometryMYSQL_TYPE_GEOMETRY
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_geometryMYSQL_TYPE_GEOMETRY
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_otherMYSQL_TYPE_*
not listed previously
obtenidas de una consulta normal (protocolo de texto de MySQL)
Nota: In theory, this should always be
0.
proto_binary_fetched_otherMYSQL_TYPE_*
not listed previously
obtenidas de una sentencia preparada (protocolo binario de MySQL)
Nota: En teoría, esto debería ser siempre
0.
connect_successNota:
connect_successholds the sum of successful persistent and non-persistent connection attempts. Therefore, the number of successful non-persistent connection attempts isconnect_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 trozos de código que causan un cierre explícito
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_closeEjemplo #2 Ejemplos de trozos de código que causan un cierre implícito
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_closein_middle_of_command_closeA 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_countmysqli_options(MYSQLI_INIT_COMMAND , $value).
El número de ejecuciones realizadas con éxito 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_*
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.
Ejemplo #3 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
explicit_stmt_closeimplicit_stmt_closeNota: Una sentencia preparada siempre se cierra explícitamente. La única vez que se cierra implícitamente es cuando falla su preparación.
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 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
bytes para casi todas las conexiones,
se debería considerar aumentar el tamaño predeterminado para evitar
reasignaciones.
connection_reused