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_sentbytes_receivedpackets_sentpackets_receivedprotocol_overhead_inprotocol_overhead_in = packets_received * 4
protocol_overhead_outprotocol_overhead_out = packets_received * 4
bytes_received_ok_packet注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_okbytes_received_eof_packet注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_eofbytes_received_rset_header_packetLOAD LOCAL INFILE、INSERT、UPDATE、SELECT、错误消息)。
注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_rset_headerbytes_received_rset_field_meta_packet注意:总字节大小包括数据包头的 size(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数据包的数量。
注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_rset_rowbytes_received_prepare_response_packet注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_prepare_responsebytes_received_change_user_packet注意:总字节大小包括数据包头的 size(4 字节,参见协议开销)。
packets_received_change_userpackets_sent_commandbytes_received_real_data_normalmysqlnd提取的有效负载字节数。 这是不源自预处理语句并已由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_psmysqlnd提取的有效负载字节数。 这是源自预处理语句并已由PHP客户端提取的结果集中实际数据的 size。 如果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_server_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 警告 发送 %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_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