Der MySQL Native Driver bietet die Möglichkeit, Statistiken über die Kommunikation zwischen Client und Server zu sammeln. Es gibt zwei Arten von Statistiken:
Wenn die Erweiterung mysqli verwendet wird, können diese Statistiken über zwei API-Aufrufe abgerufen werden:
Hinweis: Die Statistiken werden für alle Erweiterungen zusammengefasst, die den MySQL Native Driver verwenden. Wenn zum Beispiel sowohl die Erweiterung mysqli als auch der PDO-MySQL-Treiber so konfiguriert sind, dass sie MySQLnd verwenden, dann wirken sich die Funktionsaufrufe von mysqli und die Methodenaufrufe von PDO auf die Statistik aus. Es gibt keine Möglichkeit, herauszufinden, wie sehr ein bestimmter API-Aufruf einer Erweiterung, die gegen den MySQL Native Driver kompiliert wurde, eine bestimmte Statistik beeinflusst hat.
Auf die Client-Statistiken kann mit der Funktion mysqli_get_client_stats() zugegriffen werden.
Auf die Verbindungstatistiken kann mit der Funktion mysqli_get_connection_stats() zugegriffen werden.
Beide Funktionen geben ein assoziatives Array zurück, wobei der Name einer Statistik der Schlüssel für die zugehörigen statistischen Daten ist.
Die meisten Statistiken beziehen sich auf eine Verbindung, aber manche beziehen sich auf den Prozess; in diesem Fall wird darauf hingewiesen.
Die folgenden Statistiken werden vom MySQL Native Driver erstellt:
bytes_sentbytes_receivedpackets_sentpackets_receivedprotocol_overhead_inprotocol_overhead_in = packets_received * 4
protocol_overhead_outprotocol_overhead_out = packets_received * 4
bytes_received_ok_packetHinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_okbytes_received_eof_packetHinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_eofbytes_received_rset_header_packetLOAD LOCAL INFILE, INSERT,
UPDATE, SELECT, Fehlermeldung).
Hinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_rset_headerbytes_received_rset_field_meta_packetHinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_rset_field_metabytes_received_rset_row_packetrows_fetched_from_server_normal und
rows_fetched_from_server_ps von
bytes_received_rset_row_packet abgezogen werden.
Hinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_rset_rowbytes_received_prepare_response_packetHinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_prepare_responsebytes_received_change_user_packetHinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_change_userpackets_sent_commandbytes_received_real_data_normalmysqlnd abgerufen hat.
Dies ist die Größe der tatsächlichen Daten, die in den Ergebnismengen
enthalten sind, die vom PHP-Client abgerufen wurden und nicht aus
vorbereiteten Anweisungen stammen.
Zu beachten ist, dass, obwohl eine vollständige Ergebnismenge von
mysqlnd aus MySQL abgerufen wurde, diese Statistik
nur die tatsächlichen Daten zählt, die vom PHP-Client aus
mysqlnd abgerufen wurden.
Das folgende Beispiel zeigt eine Codesequenz, die den Wert erhöht:
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->fetch_assoc();
$res->close();
Die Statistik wird jedoch nicht erhöht, wenn die Ergebnismenge auf dem Client nur gepuffert, aber nicht abgerufen wird, wie im folgenden Beispiel:
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->close();
bytes_received_real_data_psmysqlnd abgerufen hat.
Dies ist die Größe der tatsächlichen Daten, die in den Ergebnismengen
enthalten sind, die vom PHP-Client abgerufen wurden und aus
vorbereiteten Anweisungen stammen.
Der Wert erhöht sich nur dann, wenn die Ergebnismenge anschließend vom
PHP-Client gelesen wird.
Zu beachten ist, dass, obwohl eine vollständige Ergebnismenge von
mysqlnd aus MySQL abgerufen wurde, diese Statistik
nur die tatsächlichen Daten zählt, die vom PHP-Client aus
mysqlnd abgerufen wurden.
Siehe auch bytes_received_real_data_normal.
result_set_queriesSELECT, SHOW.
Die Statistik wird nicht erhöht, wenn beim Lesen des Header-Pakets einer
Zeile der Ergebnismenge ein Fehler aufgetreten ist.
Hinweis: Diese Statistik kann als indirektes Maß für die Anzahl der von PHP an MySQL gesendeten Anfragen verwendet werden. Dies kann helfen, einen Client zu identifizieren, der eine hohe Datenbanklast verursacht.
non_result_set_queriesINSERT, UPDATE, LOAD DATA.
Die Statistik wird nicht erhöht, wenn beim Lesen des Header-Pakets einer
Zeile der Ergebnismenge ein Fehler aufgetreten ist.
Hinweis: Diese Statistik kann als indirektes Maß für die Anzahl der von PHP an MySQL gesendeten Anfragen verwendet werden. Dies kann helfen, einen Client zu identifizieren, der eine hohe Datenbanklast verursacht.
no_index_used--log-queries-not-using-indexes).
Hinweis: Solche Anfragen können als Exception gemeldet werden, indem
mysqli_report(MYSQLI_REPORT_INDEX);aufgerufen wird. Es ist möglich, sie stattdessen als Warnung zu melden, indemmysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);aufgerufen wird.
bad_index_used--log-slow-queries).
Hinweis: Solche Anfragen können als Exception gemeldet werden, indem
mysqli_report(MYSQLI_REPORT_INDEX);aufgerufen wird. Es ist möglich, sie stattdessen als Warnung zu melden, indemmysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);aufgerufen wird.
slow_querieslong_query_time Sekunden dauerte und bei denen
mindestens min_examined_row_limit Zeilen untersucht
werden mussten.
Wird von mysqli_report() nicht gemeldet.
buffered_setsBeispiele für API-Aufrufe, die Ergebnismengen auf dem Client puffern: mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_setsEin Beispiel für API-Aufrufe, die keine Ergebnismengen auf dem Client puffern: mysqli_use_result()
ps_buffered_setsEin Beispiel für API-Aufrufe, die Ergebnismengen auf dem Client puffern: mysqli_stmt_store_result()
ps_unbuffered_setsflushed_normal_setsHinweis: Die Bereinigung (Flushing) erfolgt nur bei ungepufferten Ergebnismengen. Ungepufferte Ergebnismengen müssen vollständig abgerufen werden, bevor eine neue Abfrage über die Verbindung ausgeführt werden kann, sonst gibt MySQL einen Fehler aus. Wenn eine Anwendung nicht alle Zeilen aus einer ungepufferten Ergebnismenge abruft, ruft mysqlnd die Ergebnismenge implizit ab, um die Verbindung freizugeben. Siehe auch
rows_skipped_normal,rows_skipped_ps.Ein paar mögliche Ursachen für einen impliziten Flush:
- Eine fehlerhafte Client-Anwendung
- Der Client hat aufgehört, Zeilen abzurufen, weil er gefunden hat, wonach er gesucht hat, aber die Ergebnismenge wurde noch nicht vollständig abgerufen
- Die Client-Anwendung wurde unerwartet beendet
flushed_ps_setsHinweis: Die Bereinigung (Flushing) erfolgt nur bei ungepufferten Ergebnismengen. Ungepufferte Ergebnismengen müssen vollständig abgerufen werden, bevor eine neue Abfrage über die Verbindung ausgeführt werden kann, sonst gibt MySQL einen Fehler aus. Wenn eine Anwendung nicht alle Zeilen aus einer ungepufferten Ergebnismenge abruft, ruft mysqlnd die Ergebnismenge implizit ab, um die Verbindung freizugeben. Siehe auch
rows_skipped_normal,rows_skipped_ps.Ein paar mögliche Ursachen für einen impliziten Flush:
- Eine fehlerhafte Client-Anwendung
- Der Client hat aufgehört, Zeilen abzurufen, weil er gefunden hat, wonach er gesucht hat, aber die Ergebnismenge wurde noch nicht vollständig abgerufen
- Die Client-Anwendung wurde unerwartet beendet
ps_prepared_never_executedps_prepared_once_executedrows_fetched_from_server_normalrows_fetched_from_server_pspackets_received_rset_row.
rows_buffered_from_client_normalBeispiele für Abfragen, die Ergebnisse puffern:
rows_buffered_from_client_psrows_buffered_from_client_normal, aber für
vorbereitete Anweisungen.
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,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_nullMYSQL_TYPE_NULL, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_bitMYSQL_TYPE_BIT,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_bitMYSQL_TYPE_BIT, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_tinyintMYSQL_TYPE_TINY,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_tinyintMYSQL_TYPE_TINY, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_shortMYSQL_TYPE_SHORT,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_shortMYSQL_TYPE_SHORT, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_int24MYSQL_TYPE_INT24,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_int24MYSQL_TYPE_INT24, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_intMYSQL_TYPE_LONG,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_intMYSQL_TYPE_LONG, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_bigintMYSQL_TYPE_LONGLONG,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_bigintMYSQL_TYPE_LONGLONG, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_decimalMYSQL_TYPE_DECIMAL oder MYSQL_TYPE_NEWDECIMAL,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_decimalMYSQL_TYPE_DECIMAL oder MYSQL_TYPE_NEWDECIMAL,
die aus einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_floatMYSQL_TYPE_FLOAT,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_floatMYSQL_TYPE_FLOAT, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_doubleMYSQL_TYPE_DOUBLE,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_doubleMYSQL_TYPE_DOUBLE, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_dateMYSQL_TYPE_DATE oder MYSQL_TYPE_NEWDATE,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_dateMYSQL_TYPE_DATE oder MYSQL_TYPE_NEWDATE,
die aus einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_yearMYSQL_TYPE_YEAR,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_yearMYSQL_TYPE_YEAR, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_timeMYSQL_TYPE_TIME,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_timeMYSQL_TYPE_TIME, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_datetimeMYSQL_TYPE_DATETIME,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_datetimeMYSQL_TYPE_DATETIME, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_timestampMYSQL_TYPE_TIMESTAMP,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_timestampMYSQL_TYPE_TIMESTAMP, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING oder MYSQL_TYPE_VARCHAR
fetched from a normal query (MySQL text protocol).
proto_binary_fetched_stringMYSQL_TYPE_STRING, MYSQL_TYPE_VARSTRING oder MYSQL_TYPE_VARCHAR
fetched from a prepared statement (MySQL binary protocol).
proto_text_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
MYSQL_TYPE_LONG_BLOB oder
MYSQL_TYPE_BLOB,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_blobMYSQL_TYPE_TINY_BLOB,
MYSQL_TYPE_MEDIUM_BLOB,
MYSQL_TYPE_LONG_BLOB oder
MYSQL_TYPE_BLOB die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_enumMYSQL_TYPE_ENUM,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_enumMYSQL_TYPE_ENUM, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_setMYSQL_TYPE_SET,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_setMYSQL_TYPE_SET, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_geometryMYSQL_TYPE_GEOMETRY,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_geometryMYSQL_TYPE_GEOMETRY, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_otherMYSQL_TYPE_*,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
Hinweis: Theoretisch sollte dies immer
0sein.
proto_binary_fetched_otherMYSQL_TYPE_*, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
Hinweis: Theoretisch sollte dies immer
0sein.
connect_successHinweis:
connect_successenthält die Summe der erfolgreichen Versuche, persistente und nicht-persistente Verbindungen herzustellen. Die Anzahl der erfolgreichen Versuche, eine nicht-persistente Verbindung herzustellen, ist alsoconnect_success - pconnect_success.
pconnect_successconnect_failurereconnectactive_connectionsHinweis: Die Anzahl der aktiven nicht-persistenten Verbindungen ist
active_connections - active_persistent_connections.
active_persistent_connectionsexplicit_closeBeispiel #1 Beispiele für Codeschnipsel, die zu einem expliziten Schließen führen
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_closeBeispiel #2 Beispiele für Codeschnipsel, die zu einem impliziten Schließen führen
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_closemysql_real_connect beim Versuch, eine Verbindung
aufzubauen, meldet.
in_middle_of_command_closeSofern keine asynchronen Abfragen verwendet werden, sollte dies nur passieren, wenn ein Skript unerwartet gestoppt wird und PHP die Verbindungen automatisch schließt.
init_command_executed_countmysqli_options(MYSQLI_INIT_COMMAND , $value).
Die Anzahl der erfolgreichen Ausführungen ist
init_command_executed_count - init_command_failed_count.
init_command_failed_countCOM_*-Befehl
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_*-Befehl von PHP an MySQL zu senden.
Die Statistik wird erhöht, nachdem die Zeile geprüft wurde und
unmittelbar bevor das entsprechende MySQL-Client-Server-Protokoll-Paket
gesendet wird.
Die Statistik wird nicht nach unten korrigiert, wenn MySQLnd das Paket
nicht über die Leitung senden kann. Im Falle eines Fehlers gibt MySQLnd
die PHP-Warnung Error while sending %s packet. PID=%d.
aus.
Beispiel #3 Beispiele für die Verwendung
Überprüfen, ob PHP bestimmte Befehle an MySQL sendet, zum Beispiel,
ob ein Client COM_PROCESS_KILL sendet
Berechnen der durchschnittlichen Anzahl der ausgeführten
vorbereiteten Anweisungen durch Vergleich von
COM_EXECUTE und COM_PREPARE
Überprüfen, ob PHP nicht-vorbereitete SQL-Anweisungen ausgeführt
hat, indem kontrolliert wird, ob COM_QUERY Null
ist
Erkennen von PHP-Skripten, die eine zu große Anzahl von
SQL-Anweisungen ausführen, indem COM_QUERY und
COM_EXECUTE überprüft werden
explicit_stmt_closeimplicit_stmt_closeHinweis: Eine vorbereitete Anweisung wird immer explizit abgeschlossen. Sie wird nur dann implizit abgeschlossen, wenn ihre Vorbereitung fehlschlägt.
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 (normale Abfrage), nicht in den Puffer
passt, vergrößert MySQLnd den Puffer auf die Größe, die zum Senden des
Befehls erforderlich ist. Jedes Mal, wenn der Puffer für eine Verbindung
vergrößert wird, wird command_buffer_too_small um
eins erhöht.
Wenn MySQLnd den Puffer bei fast jeder Verbindung über seine anfängliche
Größe von
mysqlnd.net_cmd_buffer_size
Bytes hinaus vergrößern muss, sollte in Erwägung gezogen werden, die
Standardgröße zu erhöhen, um Neuzuweisungen zu vermeiden.
connection_reused