### 27.4.2 性能模式事件过滤

[](<>)[](<>)[](<>)

事件以生产者/消费者的方式处理：

-   检测代码是事件的来源并产生要收集的事件。这[`setup_instruments`](performance-schema-setup-instruments-table.html)表列出了可以收集事件的仪器，它们是否启用，以及（对于启用的仪器）是否收集时序信息：

    ```
    mysql> SELECT NAME, ENABLED, TIMED
           FROM performance_schema.setup_instruments;
    +---------------------------------------------------+---------+-------+
    | NAME                                              | ENABLED | TIMED |
    +---------------------------------------------------+---------+-------+
    ...
    | wait/synch/mutex/sql/LOCK_global_read_lock        | YES     | YES   |
    | wait/synch/mutex/sql/LOCK_global_system_variables | YES     | YES   |
    | wait/synch/mutex/sql/LOCK_lock_db                 | YES     | YES   |
    | wait/synch/mutex/sql/LOCK_manager                 | YES     | YES   |
    ...
    ```

    这[`setup_instruments`](performance-schema-setup-instruments-table.html)table 提供了对事件产生的最基本的控制形式。为了根据被监视的对象或线程的类型进一步细化事件产生，可以使用其他表，如[第 27.4.3 节，“事件预过滤”](performance-schema-pre-filtering.html).

-   性能模式表是事件和消费事件的目的地。这[`setup_consumers`](performance-schema-setup-consumers-table.html)表列出了可以向其发送事件信息的消费者类型以及是否启用它们：

    ```
    mysql> SELECT * FROM performance_schema.setup_consumers;
    +----------------------------------+---------+
    | NAME                             | ENABLED |
    +----------------------------------+---------+
    | events_stages_current            | NO      |
    | events_stages_history            | NO      |
    | events_stages_history_long       | NO      |
    | events_statements_cpu            | NO      |
    | events_statements_current        | YES     |
    | events_statements_history        | YES     |
    | events_statements_history_long   | NO      |
    | events_transactions_current      | YES     |
    | events_transactions_history      | YES     |
    | events_transactions_history_long | NO      |
    | events_waits_current             | NO      |
    | events_waits_history             | NO      |
    | events_waits_history_long        | NO      |
    | global_instrumentation           | YES     |
    | thread_instrumentation           | YES     |
    | statements_digest                | YES     |
    +----------------------------------+---------+
    ```

    过滤可以在性能监控的不同阶段进行：

-   **预过滤。**这是通过修改性能模式配置来完成的，以便仅从生产者收集某些类型的事件，并且收集的事件仅更新某些消费者。为此，请启用或禁用仪器或消费者。预过滤由 Performance Schema 完成，具有适用于所有用户的全局效果。

    使用预过滤的原因：

    -   为了减少开销。即使启用了所有工具，性能模式开销也应该是最小的，但也许您希望进一步减少它。或者您不关心时序事件并希望禁用时序代码以消除时序开销。

    -   避免在当前事件或历史表中填充您不感兴趣的事件。预过滤在这些表格中为启用的仪器类型的行实例留出了更多“空间”。如果您仅启用带有预过滤的文件工具，则不会为非文件工具收集任何行。通过后过滤，可以收集非文件事件，为文件事件留下更少的行。

    -   避免维护某些类型的事件表。如果禁用消费者，服务器不会花时间维护该消费者的目的地。例如，如果您不关心事件历史，您可以禁用历史表使用者以提高性能。

-   **后过滤。**这涉及使用`在哪里`从性能模式表中选择信息的查询中的子句，以指定您想要查看哪些可用事件。后过滤是在每个用户的基础上执行的，因为各个用户会选择感兴趣的可用事件。

    使用后过滤的原因：

    -   避免为个人用户做出关于哪些事件信息感兴趣的决定。

    -   当预先不知道使用预过滤施加的限制时，使用性能模式来调查性能问题。

    以下部分提供了有关预过滤的更多详细信息，并提供了在过滤操作中命名工具或消费者的指南。有关编写查询以检索信息（后过滤）的信息，请参阅[第 27.5 节，“性能模式查询”](performance-schema-queries.html).
