MySQL 原生驅動程式支援收集客戶端與伺服器之間通訊的統計資料。收集的統計資料主要有兩種類型
使用 mysqli 擴充時,可以透過兩個 API 呼叫取得這些統計資料
注意:統計資料會彙總在所有使用 MySQL 原生驅動程式的擴充中。例如,如果 mysqli 擴充和 PDO MySQL 驅動程式都設定為使用 MySQLnd,則來自 mysqli 的函式呼叫和來自 PDO 的方法呼叫都會影響統計資料。 無法得知針對 MySQL 原生驅動程式編譯的任何擴充的特定 API 呼叫對特定統計資料的影響程度。
用戶端統計數據可以透過呼叫 mysqli_get_client_stats() 函式來取得。
連線統計數據可以透過呼叫 mysqli_get_connection_stats() 函式來取得。
這兩個函式都會返回一個關聯陣列,其中統計數據的名稱為對應統計數據的鍵值。
大多數統計數據都與連線相關聯,但有些統計數據與行程相關聯,在這種情況下會特別說明。
以下統計數據是由 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
注意: 總位元組數包含標頭封包的大小(4 位元組,請參閱協定額外負荷)。
packets_received_ok
bytes_received_eof_packet
注意: 總位元組數包含標頭封包的大小(4 位元組,請參閱協定額外負荷)。
packets_received_eof
bytes_received_rset_header_packet
LOAD LOCAL INFILE
、INSERT
、UPDATE
、SELECT
、錯誤訊息)而有所不同。
注意: 總位元組數包含標頭封包的大小(4 位元組,請參閱協定額外負荷)。
packets_received_rset_header
bytes_received_rset_field_meta_packet
注意: 總位元組數包含標頭封包的大小(4 位元組,請參閱協定額外負荷)。
packets_received_rset_field_meta
bytes_received_rset_row_packet
bytes_received_rset_row_packet
中減去 rows_fetched_from_server_normal
和 rows_fetched_from_server_ps
來計算錯誤和 EOF 封包的數量。
注意: 總位元組數包含標頭封包的大小(4 位元組,請參閱協定額外負荷)。
packets_received_rset_row
bytes_received_prepare_response_packet
注意: 總位元組數包含標頭封包的大小(4 位元組,請參閱協定額外負荷)。
packets_received_prepare_response
bytes_received_change_user_packet
注意: 總位元組數包含標頭封包的大小(4 位元組,請參閱協定額外負荷)。
packets_received_change_user
packets_sent_command
bytes_received_real_data_normal
mysqlnd
擷取的有效負載位元組數。這是 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_ps
mysqlnd
擷取的有效負載位元組數。這是 PHP 用戶端已擷取的、源自準備語句的結果集中所包含的實際資料大小。如果 PHP 用戶端未後續讀取結果集,則此值不會增加。請注意,儘管 mysqlnd
可能已從 MySQL 提取完整的結果集,但此統計資訊僅計算 PHP 用戶端從 mysqlnd
提取的實際資料。另請參閱 bytes_received_real_data_normal
。result_set_queries
SELECT
、SHOW
。如果從該行讀取結果集標頭封包時發生錯誤,則此統計資訊不會增加。注意:此統計資訊可用作 PHP 傳送到 MySQL 的查詢數量的間接衡量標準。這有助於識別造成高資料庫負載的用戶端。
non_result_set_queries
INSERT
、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_queries(慢速查詢)
long_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_sets(預備陳述式未緩衝的結果集)
flushed_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_executed(已準備但從未執行的預備陳述式)
ps_prepared_once_executed(僅執行一次的預備陳述式)
rows_fetched_from_server_normal(從伺服器擷取的一般列數)
rows_fetched_from_server_ps(從伺服器擷取的預備陳述式列數)
packets_received_rset_row
。 rows_buffered_from_client_normal
會緩衝結果的查詢範例
rows_buffered_from_server_ps
rows_buffered_from_client_normal
相同,但適用於預備語句。
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
類型欄位的總數。
proto_binary_fetched_null
MYSQL_TYPE_NULL
類型欄位的總數。
proto_text_fetched_bit
MYSQL_TYPE_BIT
類型欄位的總數。
proto_binary_fetched_bit
MYSQL_TYPE_BIT
類型欄位的總數。
proto_text_fetched_tinyint
MYSQL_TYPE_TINY
類型欄位的總數。
proto_binary_fetched_tinyint
MYSQL_TYPE_TINY
類型欄位的總數。
proto_text_fetched_short
MYSQL_TYPE_SHORT
類型欄位的總數。
proto_binary_fetched_short
MYSQL_TYPE_SHORT
類型欄位的總數。
proto_text_fetched_int24
MYSQL_TYPE_INT24
類型欄位的總數。
proto_binary_fetched_int24
MYSQL_TYPE_INT24
類型欄位的總數。
proto_text_fetched_int
MYSQL_TYPE_LONG
類型欄位的總數。
proto_binary_fetched_int
MYSQL_TYPE_LONG
類型欄位的總數。
proto_text_fetched_bigint
MYSQL_TYPE_LONGLONG
類型欄位的總數。
proto_binary_fetched_bigint
MYSQL_TYPE_LONGLONG
類型欄位總數。
proto_text_fetched_decimal
MYSQL_TYPE_DECIMAL
或 MYSQL_TYPE_NEWDECIMAL
類型欄位總數。
proto_binary_fetched_decimal
MYSQL_TYPE_DECIMAL
或 MYSQL_TYPE_NEWDECIMAL
類型欄位總數。
proto_text_fetched_float
MYSQL_TYPE_FLOAT
類型欄位總數。
proto_binary_fetched_float
MYSQL_TYPE_FLOAT
類型欄位總數。
proto_text_fetched_double
MYSQL_TYPE_DOUBLE
類型欄位總數。
proto_binary_fetched_double
MYSQL_TYPE_DOUBLE
類型欄位總數。
proto_text_fetched_date
MYSQL_TYPE_DATE
或 MYSQL_TYPE_NEWDATE
類型欄位總數。
proto_binary_fetched_date
MYSQL_TYPE_DATE
或 MYSQL_TYPE_NEWDATE
類型欄位總數。
proto_text_fetched_year
MYSQL_TYPE_YEAR
類型欄位總數。
proto_binary_fetched_year
MYSQL_TYPE_YEAR
類型欄位總數。
proto_text_fetched_time
MYSQL_TYPE_TIME
類型欄位總數。
proto_binary_fetched_time
MYSQL_TYPE_TIME
類型欄位總數。
proto_text_fetched_datetime
MYSQL_TYPE_DATETIME
類型欄位總數。
proto_binary_fetched_datetime
MYSQL_TYPE_DATETIME
類型欄位總數。
proto_text_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
類型欄位總數。
proto_binary_fetched_timestamp
MYSQL_TYPE_TIMESTAMP
類型欄位總數。
proto_text_fetched_string
MYSQL_TYPE_STRING
、MYSQL_TYPE_VARSTRING
或 MYSQL_TYPE_VARCHAR
類型欄位總數。
proto_binary_fetched_string
MYSQL_TYPE_STRING
、MYSQL_TYPE_VARSTRING
或 MYSQL_TYPE_VARCHAR
類型欄位總數。
proto_text_fetched_blob
MYSQL_TYPE_TINY_BLOB
、MYSQL_TYPE_MEDIUM_BLOB
、MYSQL_TYPE_LONG_BLOB
或 MYSQL_TYPE_BLOB
類型欄位總數。
proto_binary_fetched_blob
MYSQL_TYPE_TINY_BLOB
、MYSQL_TYPE_MEDIUM_BLOB
、MYSQL_TYPE_LONG_BLOB
或 MYSQL_TYPE_BLOB
類型欄位的總數。
proto_text_fetched_enum
MYSQL_TYPE_ENUM
類型欄位的總數。
proto_binary_fetched_enum
MYSQL_TYPE_ENUM
類型欄位的總數。
proto_text_fetched_set
MYSQL_TYPE_SET
類型欄位的總數。
proto_binary_fetched_set
MYSQL_TYPE_SET
類型欄位的總數。
proto_text_fetched_geometry
MYSQL_TYPE_GEOMETRY
類型欄位的總數。
proto_binary_fetched_geometry
MYSQL_TYPE_GEOMETRY
類型欄位的總數。
proto_text_fetched_other
MYSQL_TYPE_*
類型欄位的總數。
注意: 理論上,這個值應該永遠是
0
。
proto_binary_fetched_other
MYSQL_TYPE_*
類型欄位的總數。
注意: 理論上,這個值應該永遠是
0
。
connect_success
注意:
connect_success
包含持久連線和非持久連線嘗試成功的總和。因此,非持久連線嘗試成功的次數為connect_success - pconnect_success
。
pconnect_success
connect_failure
reconnect
active_connections
注意: 非持久連線的活躍連線總數為
active_connections - active_persistent_connections
。
active_persistent_connections
explicit_close
範例 #1 導致明確關閉的程式碼片段範例
$link = new mysqli(/* ... */); $link->close(/* ... */);
$link = new mysqli(/* ... */); $link->connect(/* ... */);
implicit_close
範例 #2 導致隱含關閉的程式碼片段範例
$link = new mysqli(/* ... */); $link->real_connect(/* ... */);
unset($link)
disconnect_close
mysql_real_connect
指示的連線失敗,發生於嘗試建立連線期間。
in_middle_of_command_close
除非使用非同步查詢,否則只有在 PHP 應用程式意外終止,且 PHP 自動關閉連線時才會發生這種情況。
init_command_executed_count
mysqli_options(MYSQLI_INIT_COMMAND , $value)
。 成功執行的次數為 init_command_executed_count - init_command_failed_count
。 init_command_failed_count
COM_*
命令相關統計
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_*
命令的嘗試總次數。 在檢查該行並在發送相應的 MySQL 用戶端伺服器協定封包之前,統計數據會立即增加。 如果 MySQLnd 無法通過網路發送封包,統計數據將不會減少。如果發生錯誤,MySQLnd 會發出 PHP 警告「發送 %s 封包時出錯。PID=%d。」
範例 #3 使用範例
檢查 PHP 是否向 MySQL 發送特定命令,例如,檢查用戶端是否發送 COM_PROCESS_KILL
通過比較 COM_EXECUTE
和 COM_PREPARE
來計算已準備語句的平均執行次數
通過檢查 COM_QUERY
是否為零來檢查 PHP 是否執行了任何非準備好的 SQL 語句
通過檢查 COM_QUERY
和 COM_EXECUTE
來識別執行過多 SQL 語句的 PHP 腳本
explicit_stmt_close
implicit_stmt_close
注意:預備語句一律會明確關閉。唯一會隱式關閉它的時間是在準備它失敗時。
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
(一般查詢),不適合放入緩衝區,MySQLnd 將會擴展緩衝區到發送命令所需的容量。每當一個連線的緩衝區被擴展時,command_buffer_too_small
的值就會加一。 如果 MySQLnd 幾乎在每個連線都必須將緩衝區擴展到超過其初始大小 mysqlnd.net_cmd_buffer_size 位元組,則應考慮增加預設大小以避免重新配置。connection_reused(連線重用次數)