Le pilote natif MySQL contient un support pour la collecte de statistiques sur la communication entre le client et le serveur. Les statistiques collectées sont de deux types principaux :
Lorsque l'extension mysqli est utilisée, ces statistiques peuvent être obtenues via deux appels API :
Note: Les statistiques sont agrégées parmi toutes les extensions qui utilisent le pilote natif MySQL. Par exemple, si l'extension mysqli et le pilote PDO MySQL sont tous deux configurés pour utiliser MySQLnd, alors les appels de fonctions de mysqli et les appels de méthodes de PDO affecteront les statistiques. Il n'y a aucun moyen de savoir combien un certain appel d'API d'une extension qui a été compilée sans le pilote natif MySQL a impacté une certaine statistique.
Les statistiques du client peuvent être récupérées en appelant la fonction mysqli_get_client_stats().
Les statistiques de connexion peuvent être récupérées en appelant la fonction mysqli_get_connection_stats().
Les deux fonctions retournent un tableau associatif, où le nom d'une statistique est la clé pour les données statistiques correspondantes.
La plupart des statistiques sont associées à une connexion, mais certaines sont associées au processus, auquel cas cela sera mentionné.
Les statistiques suivantes sont produites par le pilote natif 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
Note: La taille totale en octets inclut la taille de l'en-tête du paquet (4 octets, voir le surdébit du protocole).
packets_received_ok
bytes_received_eof_packet
Note: La taille totale en octets inclut la taille de l'en-tête du paquet (4 octets, voir le surdébit du protocole).
packets_received_eof
bytes_received_rset_header_packet
LOAD LOCAL INFILE
, INSERT
,
UPDATE
, SELECT
, message d'erreur).
Note: La taille totale en octets inclut la taille de l'en-tête du paquet (4 octets, voir le surdébit du protocole).
packets_received_rset_header
bytes_received_rset_field_meta_packet
Note: La taille totale en octets inclut la taille de l'en-tête du paquet (4 octets, voir le surdébit du protocole).
packets_received_rset_field_meta
bytes_received_rset_row_packet
rows_fetched_from_server_normal
et rows_fetched_from_server_ps
de bytes_received_rset_row_packet
.
Note: La taille totale en octets inclut la taille de l'en-tête du paquet (4 octets, voir le surdébit du protocole).
packets_received_rset_row
bytes_received_prepare_response_packet
Note: La taille totale en octets inclut la taille de l'en-tête du paquet (4 octets, voir le surdébit du protocole).
packets_received_prepare_response
bytes_received_change_user_packet
Note: La taille totale en octets inclut la taille de l'en-tête du paquet (4 octets, voir le surdébit du protocole).
packets_received_change_user
packets_sent_command
bytes_received_real_data_normal
mysqlnd
en utilisant le protocole texte.
Ceci est la taille des données réelles contenues dans les ensembles de résultats
qui ne proviennent pas de déclarations préparées et qui ont été récupérées par le client PHP.
Il est a noter que bien qu'un ensemble de résultats complet ait pu être extrait de MySQL
par mysqlnd
, cette statistique ne compte que les données réelles
extraites de mysqlnd
par le client PHP.
Un exemple de séquence de code qui augmentera la valeur est le suivant :
$mysqli = new mysqli(); $res = $mysqli->query("SELECT 'abc'"); $res->fetch_assoc(); $res->close();
Cependant, la statistique ne sera pas augmentée si l'ensemble de résultats est uniquement mis en mémoire tampon sur le client, mais non extrait, comme dans l'exemple suivant :
$mysqli = new mysqli(); $res = $mysqli->query("SELECT 'abc'"); $res->close();
bytes_received_real_data_ps
mysqlnd
en utilisant le protocole de déclaration préparée.
Ceci est la taille des données réelles contenues dans les ensembles de résultats
qui proviennent de déclarations préparées et qui ont été récupérées par le client PHP.
La valeur ne sera pas augmentée si l'ensemble de résultats n'est pas lu par le client PHP.
Il est a noter que bien qu'un ensemble de résultats complet ait pu être extrait de MySQL
par mysqlnd
, cette statistique ne compte que les données réelles
extraites de mysqlnd
par le client PHP.
Voir également bytes_received_real_data_normal
.
result_set_queries
SELECT
, SHOW
.
La statistique ne sera pas augmentée s'il y a une erreur lors de la lecture
de l'en-tête du paquet de l'ensemble de résultats.
Note: Cette statistique peut être utilisée comme mesure indirecte du nombre de Cela peut aider à identifier un client qui provoque une charge élevée sur la base de données. requêtes que PHP a envoyées à MySQL.
non_result_set_queries
INSERT
, UPDATE
, LOAD DATA
.
Cette statistique ne sera pas augmentée s'il y a une erreur lors de la lecture
de l'en-tête du paquet de l'ensemble de résultats.
Note: Cette statistique peut être utilisée comme mesure indirecte du nombre de Cela peut aider à identifier un client qui provoque une charge élevée sur la base de données. requêtes que PHP a envoyées à MySQL.
no_index_used
--log-queries-not-using-indexes
).
Note: Ces requêtes peuvent être signalées via une exception en appelant
mysqli_report(MYSQLI_REPORT_INDEX);
. Il est possible de les signaler via un avertissement en appelantmysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);
.
bad_index_used
--log-slow-queries
).
Note: Ces requêtes peuvent être signalées via une exception en appelant
mysqli_report(MYSQLI_REPORT_INDEX);
. Il est possible de les signaler via un avertissement en appelantmysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);
.
slow_queries
long_query_time
secondes à s'exécuter et ont nécessité au moins
min_examined_row_limit
lignes à examiner.
Pas signalé via mysqli_report().
buffered_sets
Exemple d'appels API qui mettront en mémoire tampon les ensembles de résultats sur le client : mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_sets
Exemple d'appels API qui ne mettront pas en mémoire tampon les ensembles de résultats sur le client : mysqli_use_result()
ps_buffered_sets
Exemple d'appels API qui mettront en mémoire tampon les ensembles de résultats sur le client : mysqli_stmt_store_result()
ps_unbuffered_sets
flushed_normal_sets
Note: Le vidage se produit uniquement avec des ensembles de résultats non mis en mémoire tampon. Les ensembles de résultats non mis en mémoire tampon doivent être récupérés complètement avant qu'une nouvelle requête puisse être exécutée sur la connexion, sinon MySQL lancera une erreur. Si l'application ne récupère pas toutes les lignes d'un ensemble de résultats non mis en mémoire tampon, mysqlnd récupère implicitement l'ensemble de résultats pour effacer la ligne. Voir également
rows_skipped_normal
,rows_skipped_ps
.Quelques causes possibles pour un vidage implicite :
- Application cliente défectueuse
- Client s'est arrêté de lire après avoir trouvé ce qu'il cherchait mais a fait calculer à MySQL plus de lignes que nécessaire
- L'application client s'est arrêtée de manière inattendue
flushed_ps_sets
Note: Le vidage se produit uniquement avec des ensembles de résultats non mis en mémoire tampon. Les ensembles de résultats non mis en mémoire tampon doivent être récupérés complètement avant qu'une nouvelle requête puisse être exécutée sur la connexion, sinon MySQL lancera une erreur. Si l'application ne récupère pas toutes les lignes d'un ensemble de résultats non mis en mémoire tampon, mysqlnd récupère implicitement l'ensemble de résultats pour effacer la ligne. Voir également
rows_skipped_normal
,rows_skipped_ps
.Quelques causes possibles pour un vidage implicite :
- Application cliente défectueuse
- Client s'est arrêté de lire après avoir trouvé ce qu'il cherchait mais a fait calculer à MySQL plus de lignes que nécessaire
- L'application client s'est arrêtée de manière inattendue
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
Exemple de requêtes qui mettront en mémoire tampon les ensembles de résultats :
rows_buffered_from_server_ps
rows_buffered_from_client_normal
mais pour les déclarations préparées.
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
récupères à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_null
MYSQL_TYPE_NULL
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_bit
MYSQL_TYPE_BIT
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_bit
MYSQL_TYPE_BIT
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_tinyint
MYSQL_TYPE_TINY
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_tinyint
MYSQL_TYPE_TINY
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_short
MYSQL_TYPE_SHORT
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_short
MYSQL_TYPE_SHORT
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_int24
MYSQL_TYPE_INT24
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_int24
MYSQL_TYPE_INT24
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_int
MYSQL_TYPE_LONG
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_int
MYSQL_TYPE_LONG
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_bigint
MYSQL_TYPE_LONGLONG
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_bigint
MYSQL_TYPE_LONGLONG
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_decimal
MYSQL_TYPE_DECIMAL
, or MYSQL_TYPE_NEWDECIMAL
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_decimal
MYSQL_TYPE_DECIMAL
, or MYSQL_TYPE_NEWDECIMAL
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_float
MYSQL_TYPE_FLOAT
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_float
MYSQL_TYPE_FLOAT
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_double
MYSQL_TYPE_DOUBLE
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_double
MYSQL_TYPE_DOUBLE
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_date
MYSQL_TYPE_DATE
, ou MYSQL_TYPE_NEWDATE
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_date
MYSQL_TYPE_DATE
, ou MYSQL_TYPE_NEWDATE
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_year
MYSQL_TYPE_YEAR
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_year
MYSQL_TYPE_YEAR
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_time
MYSQL_TYPE_TIME
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_time
MYSQL_TYPE_TIME
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_datetime
MYSQL_TYPE_DATETIME
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_datetime
MYSQL_TYPE_DATETIME
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
, or MYSQL_TYPE_VARCHAR
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
, or MYSQL_TYPE_VARCHAR
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_blob
MYSQL_TYPE_TINY_BLOB
,
MYSQL_TYPE_MEDIUM_BLOB
,
ou MYSQL_TYPE_BLOB
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_blob
MYSQL_TYPE_TINY_BLOB
,
MYSQL_TYPE_MEDIUM_BLOB
,
MYSQL_TYPE_LONG_BLOB
,
ou MYSQL_TYPE_BLOB
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_enum
MYSQL_TYPE_ENUM
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_enum
MYSQL_TYPE_ENUM
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_set
MYSQL_TYPE_SET
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_set
MYSQL_TYPE_SET
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_geometry
MYSQL_TYPE_GEOMETRY
récupéré à partir d'une requête normale (protocole texte MySQL).
proto_binary_fetched_geometry
MYSQL_TYPE_GEOMETRY
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_other
MYSQL_TYPE_*
non listés précédemment
récupéré à partir d'une requête normale (protocole texte MySQL).
Note: Dans la théorie, cela devrait toujours être
0
.
proto_binary_fetched_other
MYSQL_TYPE_*
non listés précédemment
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
Note: Dans la théorie, cela devrait toujours être
0
.
connect_success
Note:
connect_success
contient la somme des tentatives de connexion réussies persistantes et non persistantes. Par conséquent, le nombre de tentatives de connexion non persistantes réussies estconnect_success - pconnect_success
.
pconnect_success
connect_failure
reconnect
active_connections
Note: Le nombre total de connexions non persistantes actives est
active_connections - active_persistent_connections
.
active_persistent_connections
explicit_close
Exemple #1 Exemples de fragments de code qui provoquent une fermeture explicite
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_close
Exemple #2 Exemples de fragments de code qui provoquent une fermeture implicite
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_close
mysql_real_connect
during an attempt to
establish a connection.
in_middle_of_command_close
Sauf si des requêtes asynchrones sont utilisées, cela ne devrait se produire que si l'application PHP s'est terminée de manière inattendue et que PHP ferme automatiquement la connexion.
init_command_executed_count
mysqli_options(MYSQLI_INIT_COMMAND , $value)
.
Le nombre d'exécutions réussies est
init_command_executed_count - init_command_failed_count
.
init_command_failed_count
COM_*
Statistiques liées aux commandes
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 à MySQL.
La statistique est incrémentée après avoir vérifié la ligne et immédiatement
avant d'envoyer le paquet de protocole client serveur MySQL correspondant.
Si MySQLnd échoue à envoyer le paquet sur le réseau, les statistiques ne seront pas décrémentées.
En cas d'échec, MySQLnd émet un avertissement PHP
Error while sending %s packet. PID=%d.
Exemple #3 Exemples d'utilisation
Vérifier si PHP envoie certaines commandes à MySQL, par exemple,
vérifier si un client envoie COM_PROCESS_KILL
Calcule le nombre moyen d'exécutions de commandes préparées
en comparant COM_EXECUTE
avec
COM_PREPARE
Vérifier si PHP a exécuté des déclarations SQL non préparées en
vérifiant si COM_QUERY
est zéro
Identifier les scripts PHP qui exécutent un nombre excessif de déclarations SQL
en vérifiant COM_QUERY
et
COM_EXECUTE
explicit_stmt_close
implicit_stmt_close
Note: Une déclaration préparée est toujours explicitement fermée. La seule fois où elle est fermée implicitement est lorsque sa préparation échoue.
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
(requête normale),
ne rentre pas dans le tampon,
MyQSLnd étendra le tampon à ce qui est nécessaire pour envoyer la commande.
Chaque fois que le tampon est étendu pour une connexion
command_buffer_too_small
sera incrémenté de un.
Si mysql est obligé de faire croître le tampon au-delà de sa taille initiale de
mysqlnd.net_cmd_buffer_size
octets pour presque chaque connexion,
des considérations pour augmenter la taille par défaut devraient être prises en compte pour éviter
les réallocations.
connection_reused