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_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
Hinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_ok
bytes_received_eof_packet
Hinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_eof
bytes_received_rset_header_packet
LOAD 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_header
bytes_received_rset_field_meta_packet
Hinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_rset_field_meta
bytes_received_rset_row_packet
rows_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_row
bytes_received_prepare_response_packet
Hinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_prepare_response
bytes_received_change_user_packet
Hinweis: Die Gesamtgröße in Bytes enthält die Größe des Header-Pakets (4 Bytes, siehe Protokoll-Overhead).
packets_received_change_user
packets_sent_command
bytes_received_real_data_normal
mysqlnd
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_ps
mysqlnd
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_queries
SELECT
, 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_queries
INSERT
, 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_queries
long_query_time
Sekunden dauerte und bei denen
mindestens min_examined_row_limit
Zeilen untersucht
werden mussten.
Wird von mysqli_report() nicht gemeldet.
buffered_sets
Beispiele für API-Aufrufe, die Ergebnismengen auf dem Client puffern: mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_sets
Ein Beispiel für API-Aufrufe, die keine Ergebnismengen auf dem Client puffern: mysqli_use_result()
ps_buffered_sets
Ein Beispiel für API-Aufrufe, die Ergebnismengen auf dem Client puffern: mysqli_stmt_store_result()
ps_unbuffered_sets
flushed_normal_sets
Hinweis: 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_sets
Hinweis: 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_executed
ps_prepared_once_executed
rows_fetched_from_server_normal
rows_fetched_from_server_ps
packets_received_rset_row
.
rows_buffered_from_client_normal
Beispiele für Abfragen, die Ergebnisse puffern:
rows_buffered_from_server_ps
rows_buffered_from_client_normal
, aber für
vorbereitete Anweisungen.
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
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_null
MYSQL_TYPE_NULL
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_bit
MYSQL_TYPE_BIT
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_bit
MYSQL_TYPE_BIT
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_tinyint
MYSQL_TYPE_TINY
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_tinyint
MYSQL_TYPE_TINY
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_short
MYSQL_TYPE_SHORT
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_short
MYSQL_TYPE_SHORT
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_int24
MYSQL_TYPE_INT24
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_int24
MYSQL_TYPE_INT24
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_int
MYSQL_TYPE_LONG
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_int
MYSQL_TYPE_LONG
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_bigint
MYSQL_TYPE_LONGLONG
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_bigint
MYSQL_TYPE_LONGLONG
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_decimal
MYSQL_TYPE_DECIMAL
oder MYSQL_TYPE_NEWDECIMAL
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_decimal
MYSQL_TYPE_DECIMAL
oder MYSQL_TYPE_NEWDECIMAL
,
die aus einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_float
MYSQL_TYPE_FLOAT
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_float
MYSQL_TYPE_FLOAT
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_double
MYSQL_TYPE_DOUBLE
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_double
MYSQL_TYPE_DOUBLE
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_date
MYSQL_TYPE_DATE
oder MYSQL_TYPE_NEWDATE
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_date
MYSQL_TYPE_DATE
oder MYSQL_TYPE_NEWDATE
,
die aus einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_year
MYSQL_TYPE_YEAR
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_year
MYSQL_TYPE_YEAR
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_time
MYSQL_TYPE_TIME
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_time
MYSQL_TYPE_TIME
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_datetime
MYSQL_TYPE_DATETIME
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_datetime
MYSQL_TYPE_DATETIME
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
oder MYSQL_TYPE_VARCHAR
fetched from a normal query (MySQL text protocol).
proto_binary_fetched_string
MYSQL_TYPE_STRING
, MYSQL_TYPE_VARSTRING
oder MYSQL_TYPE_VARCHAR
fetched from a prepared statement (MySQL binary protocol).
proto_text_fetched_blob
MYSQL_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_blob
MYSQL_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_enum
MYSQL_TYPE_ENUM
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_enum
MYSQL_TYPE_ENUM
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_set
MYSQL_TYPE_SET
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_set
MYSQL_TYPE_SET
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_geometry
MYSQL_TYPE_GEOMETRY
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
proto_binary_fetched_geometry
MYSQL_TYPE_GEOMETRY
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
proto_text_fetched_other
MYSQL_TYPE_*
,
die aus einer normalen Abfrage abgerufen wurden (MySQL-Textprotokoll).
Hinweis: Theoretisch sollte dies immer
0
sein.
proto_binary_fetched_other
MYSQL_TYPE_*
, die aus
einer vorbereiteten Anweisung abgerufen wurden (MySQL-Binärprotokoll).
Hinweis: Theoretisch sollte dies immer
0
sein.
connect_success
Hinweis:
connect_success
enthä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_success
connect_failure
reconnect
active_connections
Hinweis: Die Anzahl der aktiven nicht-persistenten Verbindungen ist
active_connections - active_persistent_connections
.
active_persistent_connections
explicit_close
Beispiel #1 Beispiele für Codeschnipsel, die zu einem expliziten Schließen führen
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_close
Beispiel #2 Beispiele für Codeschnipsel, die zu einem impliziten Schließen führen
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_close
mysql_real_connect
beim Versuch, eine Verbindung
aufzubauen, meldet.
in_middle_of_command_close
Sofern 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_count
mysqli_options(MYSQLI_INIT_COMMAND , $value)
.
Die Anzahl der erfolgreichen Ausführungen ist
init_command_executed_count - init_command_failed_count
.
init_command_failed_count
COM_*
-Befehl
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_*
-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_close
implicit_stmt_close
Hinweis: Eine vorbereitete Anweisung wird immer explizit abgeschlossen. Sie wird nur dann implizit abgeschlossen, wenn ihre Vorbereitung fehlschlägt.
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
(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