该 events_waits_current
表包含当前等待事件。该表存储每个线程的当前状态,显示线程最近的监控等待事件,因此没有系统变量来配置表大小。
在包含等待事件行的表中,events_waits_current
是最基本的。其他包含等待事件行的表是从当前事件逻辑派生的。例如,events_waits_history
和 events_waits_history_long
表是每个线程和所有线程的最近等待事件的集合,分别。
有关三个等待事件表之间关系的更多信息,请参阅 第 29.9 节,“性能模式当前和历史事件表”。
有关配置是否收集等待事件的信息,请参阅 第 29.12.4 节,“性能模式等待事件表”。
该 events_waits_current
表具有以下列:
-
THREAD_ID
,EVENT_ID
与事件关联的线程和事件开始时的线程当前事件号。
THREAD_ID
和EVENT_ID
值组合唯一标识该行。没有两个行具有相同的对值。 -
END_EVENT_ID
该列在事件开始时设置为
NULL
,并在事件结束时更新为线程当前事件号。 -
EVENT_NAME
产生事件的仪器名称。这是一个
NAME
值来自setup_instruments
表。仪器名称可能具有多个部分,并形成一个层次结构,如 第 29.6 节,“性能模式仪器命名约定” 中所讨论的那样。 -
SOURCE
包含仪器化代码的源文件的名称和文件中的行号,该代码产生了事件。这使您可以检查源代码以确定确切的代码参与了什么。
-
TIMER_START
,TIMER_END
,TIMER_WAIT
事件的计时信息。这些值的单位是皮秒(秒的万亿分之一)。
TIMER_START
和TIMER_END
值指示事件计时何时开始和结束。TIMER_WAIT
是事件的持续时间(持续时间)。如果事件尚未结束,
TIMER_END
是当前计时器值,TIMER_WAIT
是到目前为止的事件时间(TIMER_END
−TIMER_START
)。如果事件来自具有
TIMED = NO
的仪器,不会收集计时信息,TIMER_START
,TIMER_END
和TIMER_WAIT
都是NULL
。有关皮秒作为事件时间单位的讨论和影响时间值的因素,请参阅 第 29.4.1 节,“性能模式事件计时”。
-
SPINS
对于互斥锁,旋转次数。如果该值为
NULL
,代码不使用旋转或旋转未被仪器化。 -
OBJECT_SCHEMA
,OBJECT_NAME
,OBJECT_TYPE
,OBJECT_INSTANCE_BEGIN
这些列标识对象 “正在被操作的对象。” 这取决于对象类型。
对于同步对象 (
cond
,mutex
,rwlock
):-
OBJECT_SCHEMA
,OBJECT_NAME
, 和OBJECT_TYPE
是NULL
。 -
OBJECT_INSTANCE_BEGIN
是内存中的同步对象地址。
对于文件 I/O 对象:
-
OBJECT_SCHEMA
是NULL
。 -
OBJECT_NAME
是文件名。 -
OBJECT_TYPE
是FILE
。 -
OBJECT_INSTANCE_BEGIN
是内存中的地址。
对于套接字对象:
-
OBJECT_NAME
是套接字的IP:PORT
值。 -
OBJECT_INSTANCE_BEGIN
是内存中的地址。
对于表 I/O 对象:
-
OBJECT_SCHEMA
是包含表的模式名称。 -
OBJECT_NAME
是表名。 -
OBJECT_TYPE
是TABLE
对于持久基本表或TEMPORARY TABLE
对于临时表。 -
OBJECT_INSTANCE_BEGIN
是内存中的地址。
一个
OBJECT_INSTANCE_BEGIN
值本身没有意义,除了不同的值表示不同的对象。OBJECT_INSTANCE_BEGIN
可以用于调试。例如,它可以与GROUP BY OBJECT_INSTANCE_BEGIN
一起使用,以查看是否将 1,000 个互斥锁(保护,例如,1,000 页或数据块)上的负载分布均匀或只是击中了几个瓶颈。这可以帮助您与其他信息来源相关联,如果您在日志文件或其他调试或性能工具中看到相同的对象地址。 -
-
INDEX_NAME
使用的索引名称。
PRIMARY
表示表的主索引。NULL
表示没有使用索引。 -
NESTING_EVENT_ID
嵌套事件的
EVENT_ID
值。 -
NESTING_EVENT_TYPE
嵌套事件类型。值是
TRANSACTION
,STATEMENT
,STAGE
, 或WAIT
。 -
OPERATION
执行的操作类型,例如
lock
,read
, 或write
。 -
NUMBER_OF_BYTES
操作读取或写入的字节数。对于表 I/O 等待(事件为
wait/io/table/sql/handler
仪器),NUMBER_OF_BYTES
表示行数。如果值大于 1,事件是批量 I/O 操作。以下讨论描述了单行报告和批量 I/O 报告之间的差异。MySQL 使用嵌套循环实现连接。性能模式仪器的任务是提供每个表的行计数和累积执行时间。在执行连接查询时,假设查询的形式如下所示,并使用表连接顺序
t1
,t2
,t3
:SELECT ... FROM t1 JOIN t2 ON ... JOIN t3 ON ...
表 “fanout” 是在连接处理中添加表时行数的增加或减少。如果表
t3
的 fanout 大于 1,那么大多数行提取操作都是针对该表的。假设连接访问t1
的 10 行,t2
的 20 行(每行来自t1
),t3
的 30 行(每行来自t2
)。使用单行报告,总的仪器操作数为:10 + (10 * 20) + (10 * 20 * 30) = 6210
通过聚合每个扫描(即,每个唯一的
t1
和t2
行组合),可以实现仪器操作数的显著减少。使用批量 I/O 报告,性能模式将为每个扫描 innermost 表t3
生成事件,而不是每行,仪器行操作数减少到:10 + (10 * 20) + (10 * 20) = 410
这是 93% 的减少,表明批量报告策略可以显著减少性能模式的开销,以减少报告调用次数。 tradeoff 是事件计时的准确性较低。相比于每行操作的时间,批量 I/O 的时间包括连接缓冲、聚合和将行返回给客户端的时间。
要使批量 I/O 报告发生,以下条件必须为真:
-
查询执行访问查询块中的最内层表(对于单表查询,该表计为最内层)
-
查询执行不请求表中的单行(因此,例如,
eq_ref
访问防止批量报告的使用) -
查询执行不评估包含表访问的子查询
-
-
FLAGS
保留供将来使用。
该 events_waits_current
表具有以下索引:
-
主键在 (
THREAD_ID
,EVENT_ID
) 上
TRUNCATE TABLE
允许用于 events_waits_current
表。它删除行。