MySQL Native Driver は、クライアントとサーバー間の通信に関する 統計情報の収集をサポートしています。 収集される統計情報は、主に以下の 2 種類です。
mysqli 拡張モジュールを使用している場合、 これらの統計情報は以下の 2 つの API 呼び出しで取得できます。
注意: 統計情報は、MySQL Native Driver を使用するすべての拡張モジュール間で 集約されます。 たとえば、mysqli 拡張モジュールと PDO MySQL ドライバの両方が MySQLnd を使用するように 設定されている場合、mysqli の関数呼び出しと PDO のメソッド呼び出しの両方が統計情報に影響します。 MySQL Native Driver を利用する各拡張モジュールの API 呼び出しが、個々の統計情報にどの程度影響しているかを特定することはできません。
クライアント統計情報は、 mysqli_get_client_stats() 関数を呼び出すことで取得できます。
接続統計情報は、 mysqli_get_connection_stats() 関数を呼び出すことで取得できます。
どちらの関数も連想配列を返します。 統計項目の名前が、対応する統計データのキーになっています。
ほとんどの統計情報は接続に関連付けられますが、 一部はプロセスに関連付けられます。その場合はその旨が記載されます。
MySQL Native Driver が生成する統計情報を以下に示します。
bytes_sentbytes_receivedpackets_sentpackets_receivedprotocol_overhead_inprotocol_overhead_in = packets_received * 4
protocol_overhead_outprotocol_overhead_out = packets_received * 4
bytes_received_ok_packet注意: 合計サイズ(バイト単位)にはヘッダパケットのサイズ (4 バイト。プロトコルオーバーヘッドを参照)が含まれます。
packets_received_okbytes_received_eof_packet注意: 合計サイズ(バイト単位)にはヘッダパケットのサイズ (4 バイト。プロトコルオーバーヘッドを参照)が含まれます。
packets_received_eofbytes_received_rset_header_packetLOAD LOCAL INFILE、INSERT、
UPDATE、SELECT、エラーメッセージ)によって異なります。
注意: 合計サイズ(バイト単位)にはヘッダパケットのサイズ (4 バイト。プロトコルオーバーヘッドを参照)が含まれます。
packets_received_rset_headerbytes_received_rset_field_meta_packet注意: 合計サイズ(バイト単位)にはヘッダパケットのサイズ (4 バイト。プロトコルオーバーヘッドを参照)が含まれます。
packets_received_rset_field_metabytes_received_rset_row_packetrows_fetched_from_server_normal
と rows_fetched_from_server_ps
を bytes_received_rset_row_packet
から差し引くことで、エラーおよび EOF パケットの数を算出できます。
注意: 合計サイズ(バイト単位)にはヘッダパケットのサイズ (4 バイト。プロトコルオーバーヘッドを参照)が含まれます。
packets_received_rset_rowbytes_received_prepare_response_packet注意: 合計サイズ(バイト単位)にはヘッダパケットのサイズ (4 バイト。プロトコルオーバーヘッドを参照)が含まれます。
packets_received_prepare_responsebytes_received_change_user_packet注意: 合計サイズ(バイト単位)にはヘッダパケットのサイズ (4 バイト。プロトコルオーバーヘッドを参照)が含まれます。
packets_received_change_userpackets_sent_commandbytes_received_real_data_normalmysqlnd から取得したペイロードのバイト数。
これは、プリペアドステートメントから生成されたものではなく、
PHP クライアントが取得した結果セットに含まれる実データのサイズです。
mysqlnd が MySQL からの結果セット全体を
取得済みであっても、この統計情報は PHP クライアントが
mysqlnd から実際に取得したデータのみをカウントすることに
注意してください。
値を増加させるコードの例を以下に示します。
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->fetch_assoc();
$res->close();
ただし、結果セットがクライアント側でバッファリングされただけで フェッチされなかった場合、以下の例のように統計情報は増加しません。
$mysqli = new mysqli();
$res = $mysqli->query("SELECT 'abc'");
$res->close();
bytes_received_real_data_psmysqlnd から取得したペイロードのバイト数。
これは、プリペアドステートメントから生成され、
PHP クライアントが取得した結果セットに含まれる実データのサイズです。
結果セットがその後 PHP クライアントによって読み取られなかった場合、値は増加しません。
mysqlnd が MySQL からの結果セット全体を
取得済みであっても、この統計情報は PHP クライアントが
mysqlnd から実際に取得したデータのみをカウントすることに
注意してください。
bytes_received_real_data_normal も参照してください。
result_set_queriesSELECT、SHOW。
結果セットのヘッダパケットの読み取り時にエラーが発生した場合、
この統計情報は増加しません。
注意: この統計情報は、PHP が MySQL に送信したクエリ数の 間接的な指標として使用できます。 これは、データベースに高い負荷をかけているクライアントの 特定に役立つ場合があります。
non_result_set_queriesINSERT、UPDATE、LOAD DATA。
結果セットのヘッダパケットの読み取り時にエラーが発生した場合、
この統計情報は増加しません。
注意: この統計情報は、PHP が MySQL に送信したクエリ数の 間接的な指標として使用できます。 これは、データベースに高い負荷をかけているクライアントの 特定に役立つ場合があります。
no_index_used--log-queries-not-using-indexes も参照してください。)
注意: これらのクエリは、
mysqli_report(MYSQLI_REPORT_INDEX);を呼び出すことで例外を通じて報告させることができます。mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);を呼び出すことで、代わりに警告として報告させることもできます。
bad_index_used--log-slow-queries も参照してください。)
注意: これらのクエリは、
mysqli_report(MYSQLI_REPORT_INDEX);を呼び出すことで例外を通じて報告させることができます。mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT);を呼び出すことで、代わりに警告として報告させることもできます。
slow_querieslong_query_time 秒以上かかり、
少なくとも min_examined_row_limit 行の検査を
必要とした SQL 文。
mysqli_report() を通じては報告されません。
buffered_setsクライアント側で結果セットをバッファリングする API 呼び出しの例: mysqli_query(), mysqli_store_result(), mysqli_stmt_get_result()
unbuffered_setsクライアント側で結果セットをバッファリングしない API 呼び出しの例: mysqli_use_result()
ps_buffered_setsクライアント側で結果セットをバッファリングする API 呼び出しの例: mysqli_stmt_store_result()
ps_unbuffered_setsflushed_normal_sets注意: フラッシュはバッファリングされない結果セットでのみ発生します。 バッファリングされない結果セットは、接続上で新しいクエリを実行する前に 完全にフェッチする必要があります。そうしないと MySQL がエラーをスローします。 アプリケーションがバッファリングされない結果セットのすべての行をフェッチしなかった場合、 mysqlnd は暗黙的に結果セットをフェッチして回線をクリアします。
rows_skipped_normal、rows_skipped_psも参照してください。暗黙的なフラッシュが発生する原因の例:
- クライアントアプリケーションの不具合
- クライアントが必要なデータを見つけた後に読み取りを中止したが、 MySQL に必要以上のレコードを計算させてしまった場合
- クライアントアプリケーションが予期せず停止した場合
flushed_ps_sets注意: フラッシュはバッファリングされない結果セットでのみ発生します。 バッファリングされない結果セットは、接続上で新しいクエリを実行する前に 完全にフェッチする必要があります。そうしないと MySQL がエラーをスローします。 アプリケーションがバッファリングされない結果セットのすべての行をフェッチしなかった場合、 mysqlnd は暗黙的に結果セットをフェッチして回線をクリアします。
rows_skipped_normal、rows_skipped_psも参照してください。暗黙的なフラッシュが発生する原因の例:
- クライアントアプリケーションの不具合
- クライアントが必要なデータを見つけた後に読み取りを中止したが、 MySQL に必要以上のレコードを計算させてしまった場合
- クライアントアプリケーションが予期せず停止した場合
ps_prepared_never_executedps_prepared_once_executedrows_fetched_from_server_normalrows_fetched_from_server_pspackets_received_rset_row も参照してください。
rows_buffered_from_client_normal結果をバッファリングするクエリの例:
rows_buffered_from_client_psrows_buffered_from_client_normal と同様ですが、
プリペアドステートメント用です。
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
型のカラムの合計数。
proto_binary_fetched_nullMYSQL_TYPE_NULL
型のカラムの合計数。
proto_text_fetched_bitMYSQL_TYPE_BIT
型のカラムの合計数。
proto_binary_fetched_bitMYSQL_TYPE_BIT
型のカラムの合計数。
proto_text_fetched_tinyintMYSQL_TYPE_TINY
型のカラムの合計数。
proto_binary_fetched_tinyintMYSQL_TYPE_TINY
型のカラムの合計数。
proto_text_fetched_shortMYSQL_TYPE_SHORT
型のカラムの合計数。
proto_binary_fetched_shortMYSQL_TYPE_SHORT
型のカラムの合計数。
proto_text_fetched_int24MYSQL_TYPE_INT24
型のカラムの合計数。
proto_binary_fetched_int24MYSQL_TYPE_INT24
型のカラムの合計数。
proto_text_fetched_intMYSQL_TYPE_LONG
型のカラムの合計数。
proto_binary_fetched_intMYSQL_TYPE_LONG
型のカラムの合計数。
proto_text_fetched_bigintMYSQL_TYPE_LONGLONG
型のカラムの合計数。
proto_binary_fetched_bigintMYSQL_TYPE_LONGLONG
型のカラムの合計数。
proto_text_fetched_decimalMYSQL_TYPE_DECIMAL または MYSQL_TYPE_NEWDECIMAL
型のカラムの合計数。
proto_binary_fetched_decimalMYSQL_TYPE_DECIMAL または MYSQL_TYPE_NEWDECIMAL
型のカラムの合計数。
proto_text_fetched_floatMYSQL_TYPE_FLOAT
型のカラムの合計数。
proto_binary_fetched_floatMYSQL_TYPE_FLOAT
型のカラムの合計数。
proto_text_fetched_doubleMYSQL_TYPE_DOUBLE
型のカラムの合計数。
proto_binary_fetched_doubleMYSQL_TYPE_DOUBLE
型のカラムの合計数。
proto_text_fetched_dateMYSQL_TYPE_DATE または MYSQL_TYPE_NEWDATE
型のカラムの合計数。
proto_binary_fetched_dateMYSQL_TYPE_DATE または MYSQL_TYPE_NEWDATE
型のカラムの合計数。
proto_text_fetched_yearMYSQL_TYPE_YEAR
型のカラムの合計数。
proto_binary_fetched_yearMYSQL_TYPE_YEAR
型のカラムの合計数。
proto_text_fetched_timeMYSQL_TYPE_TIME
型のカラムの合計数。
proto_binary_fetched_timeMYSQL_TYPE_TIME
型のカラムの合計数。
proto_text_fetched_datetimeMYSQL_TYPE_DATETIME
型のカラムの合計数。
proto_binary_fetched_datetimeMYSQL_TYPE_DATETIME
型のカラムの合計数。
proto_text_fetched_timestampMYSQL_TYPE_TIMESTAMP
型のカラムの合計数。
proto_binary_fetched_timestampMYSQL_TYPE_TIMESTAMP
型のカラムの合計数。
proto_text_fetched_stringMYSQL_TYPE_STRING、MYSQL_TYPE_VARSTRING、または MYSQL_TYPE_VARCHAR
型のカラムの合計数。
proto_binary_fetched_stringMYSQL_TYPE_STRING、MYSQL_TYPE_VARSTRING、または MYSQL_TYPE_VARCHAR
型のカラムの合計数。
proto_text_fetched_blobMYSQL_TYPE_TINY_BLOB、
MYSQL_TYPE_MEDIUM_BLOB、
MYSQL_TYPE_LONG_BLOB、
または MYSQL_TYPE_BLOB
型のカラムの合計数。
proto_binary_fetched_blobMYSQL_TYPE_TINY_BLOB、
MYSQL_TYPE_MEDIUM_BLOB、
MYSQL_TYPE_LONG_BLOB、
または MYSQL_TYPE_BLOB
型のカラムの合計数。
proto_text_fetched_enumMYSQL_TYPE_ENUM
型のカラムの合計数。
proto_binary_fetched_enumMYSQL_TYPE_ENUM
型のカラムの合計数。
proto_text_fetched_setMYSQL_TYPE_SET
型のカラムの合計数。
proto_binary_fetched_setMYSQL_TYPE_SET
型のカラムの合計数。
proto_text_fetched_geometryMYSQL_TYPE_GEOMETRY
型のカラムの合計数。
proto_binary_fetched_geometryMYSQL_TYPE_GEOMETRY
型のカラムの合計数。
proto_text_fetched_otherMYSQL_TYPE_*
型のカラムの合計数。
注意: 理論上、これは常に
0になるはずです。
proto_binary_fetched_otherMYSQL_TYPE_*
型のカラムの合計数。
注意: 理論上、これは常に
0になるはずです。
connect_success注意:
connect_successには、成功した持続的接続と 非持続的接続の試行の合計が含まれます。 したがって、成功した非持続的接続の試行数はconnect_success - pconnect_successとなります。
pconnect_successconnect_failurereconnectactive_connections注意: アクティブな非持続的接続の合計数は
active_connections - active_persistent_connectionsです。
active_persistent_connectionsexplicit_close例1 明示的なクローズが発生するコードスニペットの例
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_close例2 暗黙的なクローズが発生するコードスニペットの例
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_closemysql_real_connect 呼び出しが示す接続失敗。
in_middle_of_command_close非同期クエリを使用していない限り、 これは PHP アプリケーションが予期せず終了し、 PHP が自動的に接続をクローズした場合にのみ発生するはずです。
init_command_executed_countmysqli_options(MYSQLI_INIT_COMMAND , $value)。
成功した実行回数は
init_command_executed_count - init_command_failed_count です。
init_command_failed_countCOM_* コマンド関連の統計情報
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_*
コマンドを送信した試行回数の合計。
統計情報は、回線の確認後、対応する MySQL クライアントサーバープロトコルパケットを
送信する直前にインクリメントされます。
MySQLnd がパケットの送信に失敗した場合でも、統計情報はデクリメントされません。
失敗した場合、MySQLnd は PHP の警告
Error while sending %s packet. PID=%d.
を発行します。
例3 使用例
COM_PROCESS_KILL
を送信しているかどうかを確認する
COM_EXECUTE と
COM_PREPARE を比較して、
プリペアドステートメントの平均実行回数を算出する
COM_QUERY がゼロかどうかを確認して、
PHP がプリペアドステートメント以外の SQL 文を実行していないかどうかを確認する
COM_QUERY と
COM_EXECUTE を確認して、
過剰な数の SQL 文を実行している PHP スクリプトを特定する
explicit_stmt_closeimplicit_stmt_close注意: プリペアドステートメントは常に明示的にクローズされます。暗黙的にクローズされるのは、 準備に失敗した場合だけです。
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(通常のクエリ)が
バッファに収まらない場合、
MySQLnd はコマンドの送信に必要なサイズまでバッファを拡張します。
ある接続でバッファが拡張されるたびに、
command_buffer_too_small が 1 増加します。
MySQLnd がほぼすべての接続で初期サイズの
mysqlnd.net_cmd_buffer_size
バイトを超えてバッファを拡張する必要がある場合は、
再割り当てを避けるためにデフォルトサイズの増加を検討すべきです。
connection_reused