使用统计数据
MySQL Native Driver支持收集客户端和服务器之间通信的统计信息。收集的统计数据主要有两类:
客户统计
连接数据
如果您正在使用mysqli
扩展,这些统计数据可以通过两个API调用获得:
统计数据在使用MySQL本地驱动程序的所有扩展之间聚合。例如,在编译两者时ext / mysql
而且ext / mysqli
的函数调用ext / mysql
而且ext / mysqli
将改变统计数据。没有办法找出某个API调用的任何扩展已经编译MySQL本地驱动程序对某个统计数据的影响有多大。你可以配置PDO MySQL驱动,ext / mysql
而且ext / mysqli
可以选择使用MySQL本地驱动程序。这样做时,所有三个扩展都将更改统计信息。
访问客户端统计信息
要访问客户端统计信息,您需要调用mysqli_get_client_stats
.函数调用不需要任何参数。
函数返回一个关联数组,其中统计数据的名称作为键,统计数据的值作为值。
方法也可以访问客户机统计信息phpinfo
函数。
访问连接统计信息
访问连接统计信息调用mysqli_get_connection_stats
.这将数据库连接句柄作为参数。
函数返回一个关联数组,其中统计数据的名称作为键,统计数据的值作为值。
缓冲和非缓冲的结果集
可以对结果集进行缓冲或不进行缓冲。使用默认设置,ext / mysql
而且ext / mysqli
使用缓冲结果集用于普通(非准备语句)查询。缓冲的结果集缓存在客户机上。查询执行后,所有的结果都从MySQL Server中获取,并存储在客户端的缓存中。缓冲结果集的最大优点是,一旦客户端获取了结果,它们允许服务器释放分配给结果集的所有资源。
另一方面,未缓冲的结果集在服务器上保存的时间要长得多。如果您希望减少客户机上的内存消耗,但增加服务器上的负载,请使用无缓冲的结果。如果您的服务器负载很高,且未缓冲的结果集的数据也很高,那么您应该考虑将负载转移到客户机。客户端通常比服务器具有更好的扩展性。”负载”不仅仅是内存缓冲区——在释放一个结果集之前,服务器还需要保持其他资源的打开,例如文件句柄和线程。
预设语句默认使用无缓冲的结果集。但是,你可以使用mysqli_stmt_store_result
启用缓冲的结果集。
MySQL本地驱动程序返回的统计数据
控件返回的统计信息列表mysqli_get_client_stats
而且mysqli_get_connection_stats
功能。
表7.26返回的mysqlnd统计信息:Network
统计 | 范围 | 描述 | 笔记 |
---|---|---|---|
bytes_sent |
连接 | 从PHP发送到MySQL服务器的字节数 | 可以用来检查压缩协议的效率吗 |
bytes_received |
连接 | 从MySQL服务器接收到的字节数 | 可以用来检查压缩协议的效率吗 |
packets_sent |
连接 | 发送的MySQL Client Server协议数据包数 | 用于调试客户端服务器协议实现 |
packets_received |
连接 | 接收到的MySQL Client Server协议数据包的数量 | 用于调试客户端服务器协议实现 |
protocol_overhead_in |
连接 | MySQL Client Server协议开销(以字节为单位)。目前,只有包头(4字节)被认为是开销。Protocol_overhead_in = packets_received * 4 | 用于调试客户端服务器协议实现 |
protocol_overhead_out |
连接 | MySQL客户端服务器协议开销(以字节为单位)。目前,只有包头(4字节)被认为是开销。Protocol_overhead_out = packets_sent * 4 | 用于调试客户端服务器协议实现 |
bytes_received_ok_packet |
连接 | 接收到的MySQL客户端服务器协议OK数据包的总字节大小。OK包可以包含状态消息。状态消息的长度可以变化,因此OK包的大小是不固定的。 | 用于调试CS协议实现。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
packets_received_ok |
连接 | 收到的MySQL客户端服务器协议OK数据包的数量。 | 用于调试CS协议实现。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
bytes_received_eof_packet |
连接 | 接收到的MySQL客户端服务器协议EOF包的总字节大小。EOF的大小取决于服务器版本。此外,EOF可以传输错误消息。 | 用于调试CS协议实现。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
packets_received_eof |
连接 | MySQL Client Server协议EOF报文数。与其他包统计一样,即使PHP没有收到预期的包,但(例如)收到错误消息,包的数量也会增加。 | 用于调试CS协议实现。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
bytes_received_rset_header_packet |
连接 | MySQL客户端服务器协议结果集头数据包的总大小(以字节为单位)。数据包的大小取决于有效载荷(加载本地文件 ,插入 ,更新 ,选择 ,错误信息)。 |
用于调试CS协议实现。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
packets_received_rset_header |
连接 | MySQL Client Server协议结果集头数据包的数量。 | 用于调试CS协议实现。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
bytes_received_rset_field_meta_packet |
连接 | MySQL Client Server协议结果集元数据(字段信息)包的总字节大小。当然,大小随结果集中的字段而变化。在COM_LIST_FIELDS的情况下,包也可以传输一个错误或一个EOF包。 | 只对调试CS协议实现有用。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
packets_received_rset_field_meta |
连接 | MySQL Client Server协议结果集元数据(字段信息)包数。 | 只对调试CS协议实现有用。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
bytes_received_rset_row_packet |
连接 | MySQL Client Server协议结果集行数据包的总大小(以字节为单位)。该包也可以传输错误或EOF包。您可以反向工程的数量的错误和EOF包减法rows_fetched_from_server_normal 而且rows_fetched_from_server_ps 从bytes_received_rset_row_packet . |
只对调试CS协议实现有用。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
packets_received_rset_row |
连接 | MySQL Client Server协议结果集行数据包的数量及其总大小(以字节为单位)。 | 只对调试CS协议实现有用。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
bytes_received_prepare_response_packet |
连接 | MySQL Client Server协议OK的预备语句初始化包(预备语句初始化包)的总字节大小。数据包也可能传输错误。数据包大小取决于MySQL版本:MySQL 4.1时为9字节,MySQL 5.0以上为12字节。没有一种安全的方法可以知道发生了多少错误。例如,如果您总是连接到MySQL 5.0或更新版本,您可能能够猜出发生了错误,bytes_received_prepare_response_packet ! =packets_received_prepare_response * 12。另请参阅ps_prepared_never_executed ,ps_prepared_once_executed . |
只对调试CS协议实现有用。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
packets_received_prepare_response |
连接 | MySQL Client Server协议OK数用于预备语句初始化包(预备语句初始化包)。 | 只对调试CS协议实现有用。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
bytes_received_change_user_packet |
连接 | MySQL客户端服务器协议COM_CHANGE_USER包的总字节大小。数据包也可能传输错误或EOF。 | 只对调试CS协议实现有用。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
packets_received_change_user |
连接 | MySQL Client Server协议COM_CHANGE_USER包数 | 只对调试CS协议实现有用。注意,以字节为单位的总大小包括头包的大小(4字节,参见协议开销)。 |
packets_sent_command |
连接 | 从PHP发送到MySQL的MySQL客户端服务器协议命令的数量。没有办法知道哪些特定的命令以及发送了多少命令。最好的情况是,您可以使用它来检查PHP是否向MySQL发送了任何命令,以了解您是否可以考虑在PHP二进制文件中禁用MySQL支持。也没有办法对向MySQL发送数据时可能发生的错误数量进行逆向工程。记录的唯一错误是command_buffer_too_small(见下文)。 | 只对调试CS协议实现有用。 |
bytes_received_real_data_normal |
连接 | PHP客户机从中获取的有效负载的字节数mysqlnd 使用文本协议。 |
这是结果集中包含的实际数据的大小,这些数据不是来自准备好的语句,而是由PHP客户机获取的。注意,尽管一个完整的结果集可能已经从MySQLmysqlnd ,这个统计数据只计算实际数据mysqlnd PHP客户端。增加该值的代码序列示例如下:
每次获取操作都会增加该值。 如果结果集只在客户端被缓冲,而没有被获取,统计数据将不会增加,例如下面的例子:
|
bytes_received_real_data_ps |
连接 | PHP客户机从中获取的有效负载的字节数mysqlnd 使用准备语句协议。 |
这是由准备好的语句生成的结果集中包含的实际数据的大小,由PHP客户机获取。如果PHP客户端随后不读取结果集,则该值将不会增加。注意,尽管一个完整的结果集可能已经从MySQLmysqlnd ,这个统计数据只计算实际数据mysqlnd PHP客户端。另请参阅bytes_received_real_data_normal . |
结果集
表7.27返回的mysqlnd统计:结果集
统计 | 范围 | 描述 | 笔记 |
---|---|---|---|
result_set_queries |
连接 | 已生成结果集的查询数。生成结果集的查询示例:选择 ,显示 .如果从该行读取结果集头包时发生错误,则统计数据将不会递增。 |
您可以使用它作为PHP发送到MySQL的查询数量的间接度量,例如,识别导致数据库高负载的客户机。 |
non_result_set_queries |
连接 | 没有生成结果集的查询数。不生成结果集的查询示例:插入 ,更新 ,加载数据 .如果从该行读取结果集头包时发生错误,则统计数据将不会递增。 |
您可以使用它作为PHP发送到MySQL的查询数量的间接度量,例如,识别导致数据库高负载的客户机。 |
no_index_used |
连接 | 生成结果集但没有使用索引的查询数(参见mysqld start选项-log-queries-not-using-indexes)。如果你想报告这些查询,你可以使用mysqli_report(MYSQLI_REPORT_INDEX)让ext/mysqli抛出异常。如果你更喜欢一个警告而不是一个异常使用mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT)。 | |
bad_index_used |
连接 | 生成结果集而没有使用好的索引的查询数量(参见mysqld start option -log-slow-queries)。 | 如果你想报告这些查询,你可以使用mysqli_report(MYSQLI_REPORT_INDEX)让ext/mysqli抛出异常。如果你更喜欢一个警告而不是一个异常使用mysqli_report(MYSQLI_REPORT_INDEX ^ MYSQLI_REPORT_STRICT) |
slow_queries |
连接 | SQL语句占用了超过long_query_time 至少需要几秒钟才能执行min_examined_row_limit 要检查的行。 |
没有通过报告mysqli_report |
buffered_sets |
连接 | 返回的缓冲结果集的数目”正常的”查询。”正常的”意味着”未准备语句”在下面的注释中。 | 在客户端上缓冲结果集的API调用示例:mysql_query ,mysqli_query ,mysqli_store_result ,mysqli_stmt_get_result .在客户机上缓冲结果集可以确保尽快释放服务器资源,并使结果集更容易滚动。缺点是客户端缓存数据需要额外的内存消耗。注意,mysqlnd(与MySQL客户端库不同)尊重PHP内存限制,因为它使用PHP内部内存管理函数来分配内存。这也是原因所在memory_get_usage 当使用mysqlnd而不是MySQL客户端库时,报告内存消耗更高。memory_get_usage 根本不测量MySQL客户端库的内存消耗,因为MySQL客户端库不使用PHP内部内存管理函数所监视的函数! |
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 .隐性同花顺的一些可能原因:
|
flushed_ps_sets |
连接 | 来自已为您静默刷新的未读数据的已准备语句的结果集数目。仅对未缓冲的结果集进行刷新。 | 在连接上运行新查询之前,必须完全获取未缓冲的结果集,否则MySQL将抛出错误。如果应用程序没有从未缓冲的结果集中获取所有行,mysqlnd会隐式地获取结果集以清除该行。另请参阅rows_skipped_normal ,rows_skipped_ps .隐性同花顺的一些可能原因:
|
ps_prepared_never_executed |
连接 | 已准备但从未执行的语句数量。 | 准备好的语句会占用服务器资源。如果你不打算执行语句,就不应该准备它。 |
ps_prepared_once_executed |
连接 | 只执行一个已准备语句的数量。 | 预处理语句背后的一个想法是,如果将语句执行分为不同的准备和执行阶段,则可以一遍又一遍地执行相同的查询(使用不同的参数),并且可以节省一些解析和其他准备工作。这样做的目的是准备一次”缓存”例如,要在多个语句执行期间重用的解析树。如果只执行一次预处理语句,那么两阶段处理的效率就会大大降低”正常的”查询,因为所有的缓存都意味着额外的工作,并且需要(有限的)服务器资源来保存缓存的信息。因此,只执行一次的预处理语句可能会导致性能损失。 |
rows_fetched_from_server_normal ,rows_fetched_from_server_ps |
连接 | 从MySQL中成功获取的结果集行数,无论客户端应用程序是否使用了它们。有些行可能没有被客户端应用程序提取,而是隐式刷新了。 | 另请参阅packets_received_rset_row |
rows_buffered_from_client_normal ,rows_buffered_from_client_ps |
连接 | 来自“正常”查询或准备语句的成功缓冲行的总数。这是从MySQL中提取并在客户端上缓冲的行数。注意,对于已缓冲的行(MySQL到mysqlnd内部缓冲区)和已被客户端应用程序提取的缓冲行(mysqlnd内部缓冲区到客户端应用程序)有两个不同的统计数据。如果缓冲行数高于获取的缓冲行数,这可能意味着客户端应用程序运行的查询导致了大于所需的结果集,从而导致客户端没有读取行。 | 缓冲结果的查询示例:mysqli_query ,mysqli_store_result |
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必须执行写时复制,以保护内部网络结果缓冲区不被更改。在MySQL客户端库中,你总是在内存中保存两次获取的数据。一次在MySQL客户端库内部缓冲区中,一次在扩展返回的变量中。理论上,mysqlnd可以节省40%的内存。但是,请注意内存节省不能用memory_get_usage . |
|
explicit_free_result ,implicit_free_result |
连接、进程(仅在准备语句清理期间) | 释放的结果集的总数。 | free总是被认为是显式的,但是对于由init命令创建的结果集,例如,MYSQLI_INIT_COMMAND,… |
proto_text_fetched_null ,proto_text_fetched_bit ,proto_text_fetched_tinyint proto_text_fetched_short ,proto_text_fetched_int24 ,proto_text_fetched_int proto_text_fetched_bigint ,proto_text_fetched_decimal ,proto_text_fetched_float proto_text_fetched_double ,proto_text_fetched_date ,proto_text_fetched_year proto_text_fetched_time ,proto_text_fetched_datetime ,proto_text_fetched_timestamp proto_text_fetched_string ,proto_text_fetched_blob ,proto_text_fetched_enum proto_text_fetched_set ,proto_text_fetched_geometry ,proto_text_fetched_other |
连接 | 从普通查询(MySQL文本协议)中获取的某种类型的列的总数。 | 从C API / MySQL元数据类型到统计名称的映射:
注意,在MySQL的每个版本中,MYSQL_*类型常量不一定与完全相同的SQL列类型相关联。 |
proto_binary_fetched_null ,proto_binary_fetched_bit ,proto_binary_fetched_tinyint proto_binary_fetched_short ,proto_binary_fetched_int24 ,proto_binary_fetched_int ,proto_binary_fetched_bigint ,proto_binary_fetched_decimal ,proto_binary_fetched_float ,proto_binary_fetched_double ,proto_binary_fetched_date ,proto_binary_fetched_year ,proto_binary_fetched_time ,proto_binary_fetched_datetime ,proto_binary_fetched_timestamp ,proto_binary_fetched_string ,proto_binary_fetched_blob ,proto_binary_fetched_enum ,proto_binary_fetched_set ,proto_binary_fetched_geometry ,proto_binary_fetched_other |
连接 | 从准备好的语句(MySQL二进制协议)中获取的某种类型的总列数。 | 有关类型映射,请参见proto_text_ * 如上文中所述。 |
表7.28返回的mysqlnd统计信息:Connection
统计 | 范围 | 描述 | 笔记 |
---|---|---|---|
connect_success ,connect_failure |
连接 | 成功/失败连接尝试的总次数。 | 重用连接和所有其他类型的连接都包括在内。 |
重新连接 |
过程 | 在已打开的连接句柄上进行的(real_)连接尝试的总数。 | 代码序列$link = new mysqli(…);链接- > real_connect(…) 将导致重新连接。但$link = new mysqli(…);链接- >连接(…) 不会因为链接- >连接(…) 将显式地在建立新连接之前关闭现有连接。 |
pconnect_success |
连接 | 成功的持久连接尝试总数。 | 请注意,connect_success 保存成功的持久连接和非持久连接尝试的总和。成功的非持久连接尝试的次数为connect_success -pconnect_success . |
active_connections |
连接 | 活动持久连接和非持久连接的总数。 | |
active_persistent_connections |
连接 | 活动持久连接的总数。 | 活动的非持久连接的总数为active_connections -active_persistent_connections . |
explicit_close |
连接 | 显式关闭连接的总数(仅限于ext/mysqli)。 | 导致显式关闭的代码片段示例:
|
implicit_close |
连接 | 隐式关闭连接的总数(仅限ext/mysqli)。 | 导致隐式关闭的代码片段示例:
|
disconnect_close |
连接 | C API调用指示的连接失败mysql_real_connect 在试图建立连接时。 |
叫做disconnect_close 因为传递给C API调用的连接句柄将被关闭。 |
in_middle_of_command_close |
过程 | 在命令执行过程中关闭了连接(未获取未完成的结果集,在发送查询之后和检索答案之前,在获取数据时,在使用LOAD data传输数据时)。 | 除非使用异步查询,否则只有在脚本意外停止且PHP为您关闭连接时才会发生这种情况。 |
init_command_executed_count |
连接 | init命令执行的总数,例如:MYSQLI_INIT_COMMAND,… . |
成功执行的次数为init_command_executed_count -init_command_failed_count . |
init_command_failed_count |
连接 | 失败的init命令总数。 |
表7.29返回的mysqlnd统计信息: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。” 使用例子:
|
杂项
表7.30返回的mysqlnd统计信息
统计 | 范围 | 描述 | 笔记 |
---|---|---|---|
explicit_stmt_close ,implicit_stmt_close |
过程 | 关闭准备语句的总数。 | 除准备失败外,关闭总是被认为是显式的。 |
mem_emalloc_count ,mem_emalloc_ammount ,mem_ecalloc_count ,mem_ecalloc_ammount ,mem_erealloc_count ,mem_erealloc_ammount ,mem_efree_count ,mem_malloc_count ,mem_malloc_ammount ,mem_calloc_count ,mem_calloc_ammount ,mem_realloc_count ,mem_realloc_ammount ,mem_free_count |
过程 | 内存管理调用。 | 只有发展。 |
command_buffer_too_small |
连接 | 当从PHP发送命令到MySQL时,网络命令缓冲区扩展的数量。 | Mysqlnd分配一个内部的命令/网络缓冲区 如果mysqlnd必须使缓冲区的初始大小超过 默认的缓冲区大小是4096字节,这是可能的最小值。默认值可以通过 |
connection_reused |