Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

29.12.4.1 当前等待事件表

events_waits_current 表包含当前等待事件。该表存储每个线程的当前状态,显示线程最近的监控等待事件,因此没有系统变量来配置表大小。

在包含等待事件行的表中,events_waits_current 是最基本的。其他包含等待事件行的表是从当前事件逻辑派生的。例如,events_waits_historyevents_waits_history_long 表是每个线程和所有线程的最近等待事件的集合,分别。

有关三个等待事件表之间关系的更多信息,请参阅 第 29.9 节,“性能模式当前和历史事件表”

有关配置是否收集等待事件的信息,请参阅 第 29.12.4 节,“性能模式等待事件表”

events_waits_current 表具有以下列:

  • THREAD_ID, EVENT_ID

    与事件关联的线程和事件开始时的线程当前事件号。 THREAD_IDEVENT_ID 值组合唯一标识该行。没有两个行具有相同的对值。

  • END_EVENT_ID

    该列在事件开始时设置为 NULL,并在事件结束时更新为线程当前事件号。

  • EVENT_NAME

    产生事件的仪器名称。这是一个 NAME 值来自 setup_instruments 表。仪器名称可能具有多个部分,并形成一个层次结构,如 第 29.6 节,“性能模式仪器命名约定” 中所讨论的那样。

  • SOURCE

    包含仪器化代码的源文件的名称和文件中的行号,该代码产生了事件。这使您可以检查源代码以确定确切的代码参与了什么。

  • TIMER_START, TIMER_END, TIMER_WAIT

    事件的计时信息。这些值的单位是皮秒(秒的万亿分之一)。 TIMER_STARTTIMER_END 值指示事件计时何时开始和结束。 TIMER_WAIT 是事件的持续时间(持续时间)。

    如果事件尚未结束,TIMER_END 是当前计时器值,TIMER_WAIT 是到目前为止的事件时间(TIMER_ENDTIMER_START)。

    如果事件来自具有 TIMED = NO 的仪器,不会收集计时信息,TIMER_START, TIMER_ENDTIMER_WAIT 都是 NULL

    有关皮秒作为事件时间单位的讨论和影响时间值的因素,请参阅 第 29.4.1 节,“性能模式事件计时”

  • SPINS

    对于互斥锁,旋转次数。如果该值为 NULL,代码不使用旋转或旋转未被仪器化。

  • OBJECT_SCHEMA, OBJECT_NAME, OBJECT_TYPE, OBJECT_INSTANCE_BEGIN

    这些列标识对象 正在被操作的对象。 这取决于对象类型。

    对于同步对象 (cond, mutex, rwlock):

    • OBJECT_SCHEMA, OBJECT_NAME, 和 OBJECT_TYPENULL

    • OBJECT_INSTANCE_BEGIN 是内存中的同步对象地址。

    对于文件 I/O 对象:

    • OBJECT_SCHEMANULL

    • OBJECT_NAME 是文件名。

    • OBJECT_TYPEFILE

    • OBJECT_INSTANCE_BEGIN 是内存中的地址。

    对于套接字对象:

    • OBJECT_NAME 是套接字的 IP:PORT 值。

    • OBJECT_INSTANCE_BEGIN 是内存中的地址。

    对于表 I/O 对象:

    • OBJECT_SCHEMA 是包含表的模式名称。

    • OBJECT_NAME 是表名。

    • OBJECT_TYPETABLE 对于持久基本表或 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

    通过聚合每个扫描(即,每个唯一的 t1t2 行组合),可以实现仪器操作数的显著减少。使用批量 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 表。它删除行。