Documentation Home
MySQL 8.0 参考手册  / 第 27 章 MySQL 性能模式  /  27.9 当前和历史事件的性能模式表

27.9 当前和历史事件的性能模式表

对于等待、阶段、语句和事务事件,性能模式可以监视和存储当前事件。此外,当事件结束时,性能模式可以将它们存储在历史表中。对于每种事件类型,性能模式使用三个表来存储当前和历史事件。这些表具有以下形式的名称,其中 xxx表示事件类型(waits, stages, statements, transactions):

  • events_xxx_currentcurrent events表存储了每个线程当前监听的事件(每个线程一行)。

  • events_xxx_history最近的历史记录表存储每个线程结束的最近事件(最多每个线程的最大行数)。

  • events_xxx_history_longlong history表存储全局结束的最近事件(跨所有线程,每个表的最大行数)。

每个事件类型的_current表包含每个线程一行,因此没有用于配置其最大大小的系统变量。性能模式自动调整历史表的大小,或者可以在服务器启动时使用特定于表的系统变量显式配置大小,如描述各个历史表的部分所示。典型的自动调整值为每个表线程 10 行, _history表总计 10,000 行 _history_long

对于每种事件类型,_current_history_history_long 表具有相同的列。_current和 表具有相同的_history索引。该 _history_long表没有索引。

这些_current表显示了服务器中当前发生的情况。当当前事件结束时,它将从其_current表中删除。

_history_history_long表格显示最近发生的事情 。当历史表变满时,添加新事件时将丢弃旧事件。_history和表中的行以不同的方式过期, _history_long 因为这些表有不同的用途:

  • _history旨在独立于全局服务器负载调查单个线程。

  • _history_long旨在全局调查服务器,而不是每个线程。

两种历史表的区别与数据保留策略有关。第一次看到事件时,两个表都包含相同的数据。但是,每个表中的数据随着时间的推移会以不同的方式过期,因此数据可能会在每个表中保留更长或更短的时间:

  • 对于_history,当表包含给定线程的最大行数时,添加该线程的新行时将丢弃最旧的线程行。

  • 对于_history_long,当表变满时,添加新行时将丢弃最旧的行,而不管哪个线程生成了任一行。

当一个线程结束时,它的所有行都会从表中丢弃, _history但不会从 _history_long表中丢弃。

以下示例说明了在两种类型的历史表中添加和丢弃事件的方式的差异。这些原则同样适用于所有事件类型。该示例基于以下假设:

  • Performance Schema 配置为在表中每个线程保留 10 行,在_history表中总共保留 10,000 行_history_long

  • 线程 A 每秒生成 1 个事件。

    线程 B 每秒生成 100 个事件。

  • 没有其他线程在运行。

执行5秒后:

  • A 和 B 分别产生了 5 和 500 个事件。

  • _history包含 A 的 5 行和 B 的 10 行。由于每个线程的存储限制为 10 行,因此没有为 A 丢弃任何行,而为 B 丢弃了 490 行。

  • _history_long包含 A 的 5 行和 B 的 500 行。因为该表的最大大小为 10,000 行,所以两个线程都没有丢弃任何行。

执行 5 分钟(300 秒)后:

  • A 和 B 分别产生了 300 和 30,000 个事件。

  • _history包含 A 的 10 行和 B 的 10 行。由于每个线程的存储限制为 10 行,因此 A 丢弃了 290 行,而 B 丢弃了 29,990 行。A 的行包括最多 10 秒的数据,而B 的行包括最多只有 .1 秒的数据。

  • _history_long包含 10,000 行。因为 A 和 B 每秒共同生成 101 个事件,所以该表包含大约 10,000/101 = 99 秒前的数据,B 的行与 A 的行混合比例约为 100 比 1。