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_sentbytes_receivedpackets_sentpackets_receivedprotocol_overhead_inprotocol_overhead_in = packets_received * 4
protocol_overhead_outprotocol_overhead_out = packets_received * 4
bytes_received_ok_packetNote: 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_okbytes_received_eof_packetNote: 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_eofbytes_received_rset_header_packetLOAD 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_headerbytes_received_rset_field_meta_packetNote: 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_metabytes_received_rset_row_packetrows_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_rowbytes_received_prepare_response_packetNote: 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_responsebytes_received_change_user_packetNote: 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_userpackets_sent_commandbytes_received_real_data_normalmysqlnd 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 Ă 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_psmysqlnd 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 Ă 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_queriesSELECT, 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 requĂȘtes que PHP a envoyĂ©es Ă MySQL. Cela peut aider Ă identifier un client qui provoque une charge Ă©levĂ©e sur la base de donnĂ©es.
non_result_set_queriesINSERT, 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 requĂȘtes que PHP a envoyĂ©es Ă MySQL. Cela peut aider Ă identifier un client qui provoque une charge Ă©levĂ©e sur la base de donnĂ©es.
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_querieslong_query_time
secondes à s'exécuter et ont nécessité au moins
min_examined_row_limit lignes Ă examiner.
Pas signalé via mysqli_report().
buffered_setsExemple 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_setsExemple d'appels API qui ne mettront pas en mémoire tampon les ensembles de résultats sur le client : mysqli_use_result()
ps_buffered_setsExemple d'appels API qui mettront en mémoire tampon les ensembles de résultats sur le client : mysqli_stmt_store_result()
ps_unbuffered_setsflushed_normal_setsNote: 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_setsNote: 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_executedps_prepared_once_executedrows_fetched_from_server_normalrows_fetched_from_server_pspackets_received_rset_row.
rows_buffered_from_client_normalExemple de requĂȘtes qui mettront en mĂ©moire tampon les ensembles de rĂ©sultats :
rows_buffered_from_client_psrows_buffered_from_client_normal
mais pour les déclarations préparées.
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
rĂ©cupĂ©rĂ©es Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_nullMYSQL_TYPE_NULL
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_bitMYSQL_TYPE_BIT
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_bitMYSQL_TYPE_BIT
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_tinyintMYSQL_TYPE_TINY
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_tinyintMYSQL_TYPE_TINY
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_shortMYSQL_TYPE_SHORT
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_shortMYSQL_TYPE_SHORT
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_int24MYSQL_TYPE_INT24
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_int24MYSQL_TYPE_INT24
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_intMYSQL_TYPE_LONG
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_intMYSQL_TYPE_LONG
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_bigintMYSQL_TYPE_LONGLONG
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_bigintMYSQL_TYPE_LONGLONG
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_decimalMYSQL_TYPE_DECIMAL, ou MYSQL_TYPE_NEWDECIMAL
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_decimalMYSQL_TYPE_DECIMAL, ou MYSQL_TYPE_NEWDECIMAL
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_floatMYSQL_TYPE_FLOAT
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_floatMYSQL_TYPE_FLOAT
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_doubleMYSQL_TYPE_DOUBLE
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_doubleMYSQL_TYPE_DOUBLE
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_dateMYSQL_TYPE_DATE, ou MYSQL_TYPE_NEWDATE
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_dateMYSQL_TYPE_DATE, ou MYSQL_TYPE_NEWDATE
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_yearMYSQL_TYPE_YEAR
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_yearMYSQL_TYPE_YEAR
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_timeMYSQL_TYPE_TIME
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_timeMYSQL_TYPE_TIME
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_datetimeMYSQL_TYPE_DATETIME
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_datetimeMYSQL_TYPE_DATETIME
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_timestampMYSQL_TYPE_TIMESTAMP
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_timestampMYSQL_TYPE_TIMESTAMP
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, ou MYSQL_TYPE_VARCHAR
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING, ou MYSQL_TYPE_VARCHAR
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_blobMYSQL_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_blobMYSQL_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_enumMYSQL_TYPE_ENUM
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_enumMYSQL_TYPE_ENUM
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_setMYSQL_TYPE_SET
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_setMYSQL_TYPE_SET
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_geometryMYSQL_TYPE_GEOMETRY
rĂ©cupĂ©rĂ© Ă partir d'une requĂȘte normale (protocole texte MySQL).
proto_binary_fetched_geometryMYSQL_TYPE_GEOMETRY
récupéré à partir d'une déclaration préparée (protocole binaire MySQL).
proto_text_fetched_otherMYSQL_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_otherMYSQL_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_successNote:
connect_successcontient 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_successconnect_failurereconnectactive_connectionsNote: Le nombre total de connexions non persistantes actives est
active_connections - active_persistent_connections.
active_persistent_connectionsexplicit_closeExemple #1 Exemples de fragments de code qui provoquent une fermeture explicite
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_closeExemple #2 Exemples de fragments de code qui provoquent une fermeture implicite
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_closemysql_real_connect lors d'une tentative
d'établissement de connexion.
in_middle_of_command_closeSauf 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_countmysqli_options(MYSQLI_INIT_COMMAND , $value).
Le nombre d'exécutions réussies est
init_command_executed_count - init_command_failed_count.
init_command_failed_countCOM_* Statistiques liées aux commandes
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 Ă 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
COM_PROCESS_KILL
COM_EXECUTE avec
COM_PREPARE
COM_QUERY est zéro
COM_QUERY et
COM_EXECUTE
explicit_stmt_closeimplicit_stmt_closeNote: 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_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 (requĂȘte normale),
ne rentre pas dans le tampon,
mysqlnd é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é d'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