MySQL Native Driver包含对收集客户端和服务器之间通信统计信息的支持。收集的统计信息主要分为两种类型
使用mysqli扩展时,可以通过两个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_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
注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_ok
bytes_received_eof_packet
注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_eof
bytes_received_rset_header_packet
LOAD LOCAL INFILE
、INSERT
、UPDATE
、SELECT
、错误消息)。
注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_rset_header
bytes_received_rset_field_meta_packet
注意:总字节大小包括数据包头的 size(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数据包的数量。
注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_rset_row
bytes_received_prepare_response_packet
注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_prepare_response
bytes_received_change_user_packet
注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_change_user
packets_sent_command
bytes_received_real_data_normal
mysqlnd
提取的有效负载字节数。 这是不源自预处理语句并已由PHP客户端提取的结果集中实际数据的 size。 请注意,虽然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客户端提取的结果集中实际数据的 size。 如果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