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

对于等待、阶段、语句和事务事件，Performance Schema 可以监视和存储当前事件。此外，当事件结束时，Performance Schema 可以将它们存储在历史表中。对于每种事件类型，Performance Schema 使用三个表来存储当前和历史事件。这些表具有以下形式的名称，其中*`xxx`*表示事件类型 (`等待`,`阶段`,`陈述`,`交易`):

-   `事件_*`xxx`*_当前的`：“当前事件”表存储每个线程的当前监控事件（每个线程一行）。

-   `事件_*`xxx`*_历史`：“最近历史”表存储每个线程结束的最近事件（最多每个线程的最大行数）。

-   `事件_*`xxx`*_history_long`：“长历史”表存储全局已结束的最新事件（跨所有线程，最多每个表的最大行数）。

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

    对于每种事件类型，`_当前的`,`_历史`， 和`_history_long`表具有相同的列。这`_当前的`和`_历史`表具有相同的索引。这`_history_long`表没有索引。

    这`_当前的`表格显示服务器内当前发生的情况。当当前事件结束时，它会从它的`_当前的`桌子。

    这`_历史`和`_history_long`表格显示了最近发生的事情。当历史表变满时，旧事件被丢弃，因为新事件被添加。行从`_历史`和`_history_long`以不同的方式使用表格，因为这些表格有不同的用途：

-   `_历史`旨在调查单个线程，独立于全局服务器负载。

-   `_history_long`旨在全局调查服务器，而不是每个线程。

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

-   为了`_历史`，当表包含给定线程的最大行数时，当为该线程添加新行时，最旧的线程行将被丢弃。

-   为了`_history_long`，当表变满时，添加新行时最旧的行将被丢弃，无论哪个线程生成任一行。

    当一个线程结束时，它的所有行都会从`_历史`表但不是从`_历史悠久`桌子

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

-   性能模式配置为在数据库中每个线程保留10行`_历史`表和表中总计10000行`_历史悠久`桌子

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

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

-   没有其他线程正在运行。

    执行5秒后：

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

-   `_历史`包含A的5行和B的10行。因为每个线程的存储限制为10行，所以A没有丢弃任何行，而B则丢弃了490行。

-   `_历史悠久`A包含5行，B包含500行。由于表的最大大小为10000行，因此两个线程均未丢弃任何行。

    执行5分钟（300秒）后：

-   A和B分别产生了300和30000个事件。

-   `_历史`包含A的10行和B的10行。由于每个线程的存储限制为10行，因此A已丢弃290行，而B已丢弃29990行。A的行包含最长10秒的数据，而B的行仅包含最长0.1秒的数据。

-   `_历史悠久`包含10000行。由于A和B一起每秒生成101个事件，因此该表包含的数据最长约为10000/101=99秒，其中B的行数约为100到1，而A的行数约为100到1。
