统计

MySQL 本机驱动包含支持收集客户端和服务器之间通信的统计信息。收集的统计信息主要分为两种类型

  • 客户端统计信息
  • 连接统计信息

当使用 mysqli 扩展时,可以通过两个 API 调用获取这些统计信息

注意: 统计信息在所有使用 MySQL 本机驱动的扩展之间进行汇总。例如,如果 mysqli 扩展和 PDO MySQL 驱动程序都设置为使用 MySQLnd,则来自 mysqli 的函数调用和来自 PDO 的方法调用将影响统计信息。 无法确定针对 MySQL 本机驱动程序编译的任何扩展的特定 API 调用对特定统计信息的影响程度。

检索统计信息

可以通过调用 mysqli_get_client_stats() 函数检索客户端统计信息。

可以通过调用 mysqli_get_connection_stats() 函数检索连接统计信息。

这两个函数都返回一个关联数组,其中统计信息的名称是对应统计数据的键。

MySQL 本机驱动程序统计信息

大多数统计信息与连接相关联,但有些与进程相关联,在这种情况下将予以提及。

以下统计信息由 MySQL 本机驱动程序生成

网络相关统计信息
bytes_sent
从 PHP 发送到 MySQL 服务器的字节数。
bytes_received
从 MySQL 服务器接收的字节数。
packets_sent
MySQL 客户端服务器协议发送的包数。
packets_received
从 MySQL 客户端服务器协议接收的包数。
protocol_overhead_in
传入流量的 MySQL 客户端服务器协议开销(以字节为单位)。目前仅将数据包头 (4 字节) 视为开销。 protocol_overhead_in = packets_received * 4
protocol_overhead_out
传出流量的 MySQL 客户端服务器协议开销(以字节为单位)。目前仅将数据包头 (4 字节) 视为开销。 protocol_overhead_out = packets_received * 4
bytes_received_ok_packet
接收到的 MySQL 客户端服务器协议 OK 数据包的总字节大小。OK 数据包可以包含状态消息。状态消息的长度可能会有所不同,因此 OK 数据包的大小并非固定。

注意: 总字节大小包括数据包头的大小(4 字节,请参阅协议开销)。

packets_received_ok
接收到的 MySQL 客户端服务器协议 OK 数据包数量。
bytes_received_eof_packet
接收到的 MySQL 客户端服务器协议 EOF 数据包的总字节大小。EOF 的大小根据服务器版本而有所不同。此外,EOF 可以传输错误消息。

注意: 总字节大小包括数据包头的大小(4 字节,请参阅协议开销)。

packets_received_eof
MySQL 客户端服务器协议 EOF 数据包的数量。 与其他数据包统计信息一样,即使 PHP 没有接收到预期的数据包,例如错误消息,数据包数量也会增加。
bytes_received_rset_header_packet
MySQL 客户端服务器协议结果集标头数据包的总字节大小。数据包的大小根据有效负载而有所不同 (LOAD LOCAL INFILE, INSERT, UPDATE, SELECT, 错误消息)。

注意: 总字节大小包括数据包头的大小(4 字节,请参阅协议开销)。

packets_received_rset_header
MySQL 客户端服务器协议结果集标头数据包的数量。
bytes_received_rset_field_meta_packet
MySQL 客户端服务器协议结果集元数据(字段信息)数据包的总字节大小。当然,大小会根据结果集中的字段而有所不同。该数据包还可以在 COM_LIST_FIELDS 的情况下传输错误或 EOF 数据包。

注意: 总字节大小包括数据包头的大小(4 字节,请参阅协议开销)。

packets_received_rset_field_meta
MySQL 客户端服务器协议结果集元数据(字段信息)数据包的数量。
bytes_received_rset_row_packet
MySQL 客户端服务器协议结果集行数据包的总字节大小。该数据包还可以在情况下传输错误或 EOF 数据包。可以通过从 rows_fetched_from_server_normalrows_fetched_from_server_ps 中减去 bytes_received_rset_row_packet 来计算错误和 EOF 数据包的数量。

注意: 总字节大小包括数据包头的大小(4 字节,请参阅协议开销)。

packets_received_rset_row
MySQL 客户端服务器协议结果集行数据包的数量。
bytes_received_prepare_response_packet
MySQL 客户端服务器协议 OK for Prepared Statement Initialization 数据包(准备语句初始化数据包)的总字节大小。该数据包还可能传输错误。数据包大小取决于 MySQL 版本。

注意: 总字节大小包括数据包头的大小(4 字节,请参阅协议开销)。

packets_received_prepare_response
MySQL 客户端服务器协议 OK for Prepared Statement Initialization 数据包(准备语句初始化数据包)的数量。
bytes_received_change_user_packet
MySQL 客户端服务器协议 COM_CHANGE_USER 数据包的总字节大小。该数据包还可能传输错误或 EOF。

注意: 总字节大小包括数据包头的大小(4 字节,请参阅协议开销)。

packets_received_change_user
MySQL 客户端服务器协议 COM_CHANGE_USER 数据包的数量。
packets_sent_command
从 PHP 发送到 MySQL 的 MySQL 客户端服务器协议命令数量。 无法确定已发送了哪些特定命令以及发送了多少命令。
bytes_received_real_data_normal
PHP 客户端使用文本协议从 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
PHP 客户端使用准备语句协议从 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
生成结果集但未使用索引的查询数量。(另请参阅 mysqld 启动选项 --log-queries-not-using-indexes)。

注意: 这些查询可以通过调用 mysqli_report(MYSQLI_REPORT_INDEX); 通过异常报告。可以通过调用 mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT); 通过警告而不是异常报告它们。

bad_index_used
生成结果集但未使用良好索引的查询数量。(另请参阅 mysqld 启动选项 --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_normalrows_skipped_ps

隐式刷新的可能原因

  • 有缺陷的客户端应用程序
  • 客户端在找到所需内容后停止读取,但已使 MySQL 计算了比需要更多的记录
  • 客户端应用程序意外停止

flushed_ps_sets
来自具有未读取数据的已静默刷新的准备语句的结果集数量。

注意 刷新仅在未缓冲结果集上发生。 未缓冲结果集必须在连接上运行新的查询之前完全获取,否则 MySQL 将抛出错误。 如果应用程序没有从未缓冲的结果集获取所有行,mysqlnd 会隐式获取结果集以清除行。 另请参阅 rows_skipped_normalrows_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
来自普通查询的缓冲行总数。 这是从 MySQL 获取并缓存在客户端的行数。

将缓冲结果的查询示例

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
这是一个进程级范围的统计信息。 使用 mysqlnd,扩展返回的变量指向 mysqlnd 内部网络结果缓冲区。 如果数据没有更改,则获取的数据仅在内存中保存一次。 但是,对数据的任何修改都需要 mysqlnd 执行写时复制操作。
explicit_free_result
implicit_free_result
这是一个连接和进程级范围的统计信息。 释放的结果集总数。
proto_text_fetched_null
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_NULL 的列总数。
proto_binary_fetched_null
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_NULL 的列总数。
proto_text_fetched_bit
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_BIT 的列总数。
proto_binary_fetched_bit
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_BIT 的列总数。
proto_text_fetched_tinyint
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_TINY 的列总数。
proto_binary_fetched_tinyint
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_TINY 的列总数。
proto_text_fetched_short
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_SHORT 的列总数。
proto_binary_fetched_short
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_SHORT 的列总数。
proto_text_fetched_int24
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_INT24 的列总数。
proto_binary_fetched_int24
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_INT24 的列总数。
proto_text_fetched_int
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_LONG 的列总数。
proto_binary_fetched_int
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_LONG 的列总数。
proto_text_fetched_bigint
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_LONGLONG 的列总数。
proto_binary_fetched_bigint
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_LONGLONG 的列总数。
proto_text_fetched_decimal
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_DECIMALMYSQL_TYPE_NEWDECIMAL 的列总数。
proto_binary_fetched_decimal
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_DECIMALMYSQL_TYPE_NEWDECIMAL 的列总数。
proto_text_fetched_float
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_FLOAT 的列总数。
proto_binary_fetched_float
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_FLOAT 的列总数。
proto_text_fetched_double
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_DOUBLE 的列总数。
proto_binary_fetched_double
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_DOUBLE 的列总数。
proto_text_fetched_date
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_DATEMYSQL_TYPE_NEWDATE 的列总数。
proto_binary_fetched_date
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_DATEMYSQL_TYPE_NEWDATE 的列总数。
proto_text_fetched_year
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_YEAR 的列总数。
proto_binary_fetched_year
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_YEAR 的列总数。
proto_text_fetched_time
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_TIME 的列总数。
proto_binary_fetched_time
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_TIME 的列总数。
proto_text_fetched_datetime
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_DATETIME 的列总数。
proto_binary_fetched_datetime
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_DATETIME 的列总数。
proto_text_fetched_timestamp
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_TIMESTAMP 的列总数。
proto_binary_fetched_timestamp
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_TIMESTAMP 的列总数。
proto_text_fetched_string
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_STRINGMYSQL_TYPE_VARSTRINGMYSQL_TYPE_VARCHAR 的列总数。
proto_binary_fetched_string
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_STRINGMYSQL_TYPE_VARSTRINGMYSQL_TYPE_VARCHAR 的列总数。
proto_text_fetched_blob
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_TINY_BLOBMYSQL_TYPE_MEDIUM_BLOBMYSQL_TYPE_LONG_BLOBMYSQL_TYPE_BLOB 的列总数。
proto_binary_fetched_blob
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_TINY_BLOBMYSQL_TYPE_MEDIUM_BLOBMYSQL_TYPE_LONG_BLOBMYSQL_TYPE_BLOB 的列总数。
proto_text_fetched_enum
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_ENUM 的列总数。
proto_binary_fetched_enum
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_ENUM 的列总数。
proto_text_fetched_set
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_SET 的列总数。
proto_binary_fetched_set
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_SET 的列总数。
proto_text_fetched_geometry
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_GEOMETRY 的列总数。
proto_binary_fetched_geometry
从准备语句(MySQL 二进制协议)获取的类型为 MYSQL_TYPE_GEOMETRY 的列总数。
proto_text_fetched_other
从普通查询(MySQL 文本协议)获取的类型为 MYSQL_TYPE_*(之前未列出)的列总数。

注意 从理论上讲,这应该始终为 0

proto_binary_fetched_other
从准备语句(MySQL 二进制协议)获取的类型为 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)
  • 持久连接:使用 real_connect 创建了连接池,可能设置了一些未知选项 - 隐式关闭以避免返回具有未知选项的连接
  • 持久连接:ping/change_user 失败,ext/mysqli 关闭连接
  • 脚本执行结束:关闭用户未关闭的连接
disconnect_close
尝试建立连接时,C API 调用 mysql_real_connect 指示的连接失败。
in_middle_of_command_close
这是一个进程级范围的统计数据。 连接在命令执行过程中关闭(未获取未完成的结果集,在发送查询后但在检索答案之前,在获取数据时,在使用 LOAD DATA 传输数据时)。
警告

除非使用异步查询,否则这种情况只会在 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
从 PHP 发送到 MySQL 的特定 COM_* 命令的尝试次数。 在检查行后立即在发送相应的 MySQL 客户端服务器协议包之前增加统计信息。
注意

如果 MySQLnd 无法通过网络发送数据包,则不会减少统计数据。 如果失败,MySQLnd 将发出 PHP 警告 发送 %s 数据包时出错。 PID=%d.

示例 #3 使用示例

  • 检查 PHP 是否向 MySQL 发送某些命令,例如,检查客户端是否发送 COM_PROCESS_KILL

  • 通过比较 COM_EXECUTECOM_PREPARE 来计算已准备语句执行的平均次数

  • 通过检查 COM_QUERY 是否为零来检查 PHP 是否运行了任何非准备好的 SQL 语句

  • 通过检查 COM_QUERYCOM_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
从 PHP 发送到 MySQL 的命令时,网络命令缓冲区扩展的次数。 MySQLnd 为每个连接分配一个 mysqlnd.net_cmd_buffer_size 字节的内部命令/网络缓冲区。 如果 MySQL 客户端服务器协议命令,例如 COM_QUERY(普通查询)不适合缓冲区,MySQLnd 将根据需要扩展缓冲区以发送命令。 每当缓冲区为一个连接扩展时,command_buffer_too_small 将增加 1。 如果 MySQLnd 必须将缓冲区扩展到其初始大小的 mysqlnd.net_cmd_buffer_size 字节以外,几乎每个连接都会进行扩展,应考虑增加默认大小以避免重新分配。
connection_reused
持久连接被重用的总次数。
添加说明

用户贡献说明

此页面没有用户贡献的说明。
To Top