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_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 paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_).
packets_received_ok
bytes_received_eof_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_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 paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_).
packets_received_rset_header
bytes_received_rset_field_meta_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_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 paquete de cabecera (4 bytes, véase la carga adicional del protocolo - protocol_overhead_).
packets_received_rset_row
bytes_received_prepare_response_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_prepare_response
bytes_received_change_user_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_change_user
packets_sent_command
bytes_received_real_data_normal
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();
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_ps
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
.
result_set_queries
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.
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_queries
INSERT
, 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_queries
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
Ejemplos 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_sets
Ejemplos de llamadas a la API que no almacenan en buffer conjuntos de resultados en el cliente: mysqli_use_result()
ps_buffered_sets
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
flushed_normal_sets
Nota: 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
Nota: 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
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 buffer resultados:
rows_buffered_from_server_ps
rows_buffered_from_client_normal
pero para sentencias 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
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_null
MYSQL_TYPE_NULL
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_bit
MYSQL_TYPE_BIT
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_bit
MYSQL_TYPE_BIT
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_tinyint
MYSQL_TYPE_TINY
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_tinyint
MYSQL_TYPE_TINY
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_short
MYSQL_TYPE_SHORT
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_short
MYSQL_TYPE_SHORT
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_int24
MYSQL_TYPE_INT24
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_int24
MYSQL_TYPE_INT24
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_int
MYSQL_TYPE_LONG
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_int
MYSQL_TYPE_LONG
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_bigint
MYSQL_TYPE_LONGLONG
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_bigint
MYSQL_TYPE_LONGLONG
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_decimal
MYSQL_TYPE_DECIMAL
, or MYSQL_TYPE_NEWDECIMAL
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_decimal
MYSQL_TYPE_DECIMAL
, or MYSQL_TYPE_NEWDECIMAL
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_float
MYSQL_TYPE_FLOAT
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_float
MYSQL_TYPE_FLOAT
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_double
MYSQL_TYPE_DOUBLE
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_double
MYSQL_TYPE_DOUBLE
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_date
MYSQL_TYPE_DATE
, or MYSQL_TYPE_NEWDATE
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_date
MYSQL_TYPE_DATE
, or MYSQL_TYPE_NEWDATE
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_year
MYSQL_TYPE_YEAR
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_year
MYSQL_TYPE_YEAR
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_time
MYSQL_TYPE_TIME
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_time
MYSQL_TYPE_TIME
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_datetime
MYSQL_TYPE_DATETIME
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_datetime
MYSQL_TYPE_DATETIME
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
, or MYSQL_TYPE_VARCHAR
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
, or MYSQL_TYPE_VARCHAR
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_blob
MYSQL_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_blob
MYSQL_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_enum
MYSQL_TYPE_ENUM
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_enum
MYSQL_TYPE_ENUM
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_set
MYSQL_TYPE_SET
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_set
MYSQL_TYPE_SET
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_geometry
MYSQL_TYPE_GEOMETRY
obtenidas de una consulta normal (protocolo de texto de MySQL)
proto_binary_fetched_geometry
MYSQL_TYPE_GEOMETRY
obtenidas de una sentencia preparada (protocolo binario de MySQL)
proto_text_fetched_other
MYSQL_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_other
MYSQL_TYPE_*
not listed previously
obtenidas de una sentencia preparada (protocolo binario de MySQL)
Nota: En teoría, esto debería ser siempre
0
.
connect_success
Nota:
connect_success
holds the sum of successful persistent and non-persistent connection attempts. Therefore, the number of successful non-persistent connection attempts isconnect_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 trozos de código que causan un cierre explícito
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_close
Ejemplo #2 Ejemplos de trozos de código que causan un cierre implícito
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_close
in_middle_of_command_close
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
mysqli_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_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_*
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_close
implicit_stmt_close
Nota: Una sentencia preparada siempre se cierra explícitamente. La única vez que se cierra implícitamente es cuando falla su preparación.
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 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