### 27.4.6 按线程预过滤

这[`线程`](performance-schema-threads-table.html)表包含每个服务器线程的一行。每行包含有关线程的信息，并指示是否为其启用了监视。为了让 Performance Schema 监控线程，这些事情必须是真实的：

-   这`线程仪表`消费者在[`setup_consumers`](performance-schema-setup-consumers-table.html)表必须是`是的`.

-   这`线程.仪表`列必须是`是的`.

-   仅对那些由在[`setup_instruments`](performance-schema-setup-instruments-table.html)桌子。

    这[`线程`](performance-schema-threads-table.html)table 还为每个服务器线程指示是否执行历史事件记录。这包括等待、阶段、语句和事务事件，并影响对这些表的日志记录：


```
events_waits_history
events_waits_history_long
events_stages_history
events_stages_history_long
events_statements_history
events_statements_history_long
events_transactions_history
events_transactions_history_long
```

要发生历史事件记录，这些事情必须是真实的：

-   适当的历史相关消费者[`setup_consumers`](performance-schema-setup-consumers-table.html)必须启用表。例如，等待事件记录在[`events_waits_history`](performance-schema-events-waits-history-table.html)和[`events_waits_history_long`](performance-schema-events-waits-history-long-table.html)表需要相应的`events_waits_history`和`events_waits_history_long`消费者成为`是的`.

-   这`线程.历史`列必须是`是的`.

-   日志记录仅发生在那些从仪器中启用的线程事件中。[`setup_instruments`](performance-schema-setup-instruments-table.html)桌子。

    对于前台线程（由客户端连接产生），`仪表`和`历史`中的列[`线程`](performance-schema-threads-table.html)表行由与线程关联的用户帐户是否匹配表中的任何行来确定[`setup_actors`](performance-schema-setup-actors-table.html)桌子。值来自`已启用`和`历史`匹配的列[`setup_actors`](performance-schema-setup-actors-table.html)表行。

    对于后台线程，没有关联的用户。`仪表`和`历史`是`是的`默认情况下和[`setup_actors`](performance-schema-setup-actors-table.html)不咨询。

    最初的[`setup_actors`](performance-schema-setup-actors-table.html)内容如下所示：


```
mysql> SELECT * FROM performance_schema.setup_actors;
+------+------+------+---------+---------+
| HOST | USER | ROLE | ENABLED | HISTORY |
+------+------+------+---------+---------+
| %    | %    | %    | YES     | YES     |
+------+------+------+---------+---------+
```

这`主持人`和`用户`列应包含文字主机名或用户名，或`'%'`匹配任何名称。

这`已启用`和`历史`列指示是否为匹配线程启用检测和历史事件日志记录，这取决于前面描述的其他条件。

当性能模式为每个新的前台线程检查匹配时`setup_actors`，它首先尝试找到更具体的匹配，使用`用户`和`主持人`列 （`角色`未使用）：

-   行与`用户='*`文字`*'`和`主机='*`文字`*'`.

-   行与`用户='*`文字`*'`和`主机='%'`.

-   行与`用户='%'`和`主机='*`文字`*'`.

-   行与`用户='%'`和`主机='%'`.

    匹配发生的顺序很重要，因为不同的匹配[`setup_actors`](performance-schema-setup-actors-table.html)行可以有不同的`用户`和`主持人`价值观。这使得可以根据主机、用户或帐户（用户和主机组合）有选择地应用检测和历史事件日志记录`已启用`和`历史`列值：

-   当最佳匹配是一行时`启用=是`， 这`仪表`线程的值变为`是的`.当最佳匹配是一行时`历史=是`， 这`历史`线程的值变为`是的`.

-   当最佳匹配是一行时`启用=否`， 这`仪表`线程的值变为`不`.当最佳匹配是一行时`历史=否`， 这`历史`线程的值变为`不`.

-   当没有找到匹配项时，`仪表`和`历史`线程的值变成`不`.

    这`已启用`和`历史`中的列[`setup_actors`](performance-schema-setup-actors-table.html)行可以设置为`是的`要么`不`彼此独立。这意味着您可以与是否收集历史事件分开启用检测。

    默认情况下，为所有新的前台线程启用监视和历史事件收集，因为[`setup_actors`](performance-schema-setup-actors-table.html)表最初包含一行`'%'`对彼此而言`主持人`和`用户`.要执行更有限的匹配，例如仅对某些前台线程启用监视，您必须更改此行，因为它匹配任何连接，并添加行以获取更具体的`主持人`/`用户`组合。

    假设你修改[`setup_actors`](performance-schema-setup-actors-table.html)如下：


```
UPDATE performance_schema.setup_actors
SET ENABLED = 'NO', HISTORY = 'NO'
WHERE HOST = '%' AND USER = '%';
INSERT INTO performance_schema.setup_actors
(HOST,USER,ROLE,ENABLED,HISTORY)
VALUES('localhost','joe','%','YES','YES');
INSERT INTO performance_schema.setup_actors
(HOST,USER,ROLE,ENABLED,HISTORY)
VALUES('hosta.example.com','joe','%','YES','NO');
INSERT INTO performance_schema.setup_actors
(HOST,USER,ROLE,ENABLED,HISTORY)
VALUES('%','sam','%','NO','YES');
```

这[`更新`](update.html)语句更改默认匹配以禁用检测和历史事件收集。这[`插入`](insert.html)语句为更具体的匹配添加行。

现在 Performance Schema 确定如何设置`仪表`和`历史`新连接线程的值如下：

-   如果`乔`从本地主机连接，连接匹配第一个插入的行。这`仪表`和`历史`线程的值变成`是的`.

-   如果`乔`从连接`hosta.example.com`，连接匹配第二个插入的行。这`仪表`线程的值变为`是的`和`历史`价值变成`不`.

-   如果`乔`从任何其他主机连接，没有匹配。这`仪表`和`历史`线程的值变成`不`.

-   如果`山姆`从任何主机连接，连接匹配第三个插入的行。这`仪表`线程的值变为`不`和`历史`价值变成`是的`.

-   对于任何其他连接，带有`主持人`和`用户`调成`'%'`火柴。该行现在有`已启用`和`历史`调成`不`， 所以`仪表`和`历史`线程的值变成`不`.

    的修改[`setup_actors`](performance-schema-setup-actors-table.html)表只影响修改后创建的前台线程，不影响现有线程。要影响现有线程，请修改`仪表`和`历史`列[`线程`](performance-schema-threads-table.html)表行。
