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
rows_fetched_from_server_normal
和 rows_fetched_from_server_ps
中减去 bytes_received_rset_row_packet
来计算错误和 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
将增加 1。 如果 MySQLnd 必须将缓冲区扩展到其初始大小的 mysqlnd.net_cmd_buffer_size 字节以外,几乎每个连接都会进行扩展,应考虑增加默认大小以避免重新分配。 connection_reused