#### 27.12.21.6 线程表

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

这[`线程`](performance-schema-threads-table.html)表包含每个服务器线程的一行。每行包含有关线程的信息，并指示是否为其启用了监视和历史事件日志记录：

```
mysql> SELECT * FROM performance_schema.threads\G
*************************** 1. row ***************************
          THREAD_ID: 1
               NAME: thread/sql/main
               TYPE: BACKGROUND
     PROCESSLIST_ID: NULL
   PROCESSLIST_USER: NULL
   PROCESSLIST_HOST: NULL
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: NULL
   PROCESSLIST_TIME: 80284
  PROCESSLIST_STATE: NULL
   PROCESSLIST_INFO: NULL
   PARENT_THREAD_ID: NULL
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: NULL
       THREAD_OS_ID: 489803
     RESOURCE_GROUP: SYS_default
...
*************************** 4. row ***************************
          THREAD_ID: 51
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 34
   PROCESSLIST_USER: isabella
   PROCESSLIST_HOST: localhost
     PROCESSLIST_DB: performance_schema
PROCESSLIST_COMMAND: Query
   PROCESSLIST_TIME: 0
  PROCESSLIST_STATE: Sending data
   PROCESSLIST_INFO: SELECT * FROM performance_schema.threads
   PARENT_THREAD_ID: 1
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: SSL/TLS
       THREAD_OS_ID: 755399
     RESOURCE_GROUP: USR_default
...
```

当 Performance Schema 初始化时，它会填充[`线程`](performance-schema-threads-table.html)基于当时存在的线程的表。此后，每次服务器创建线程时都会添加一个新行。

这`仪表`和`历史`新线程的列值由[`setup_actors`](performance-schema-setup-actors-table.html)桌子。有关如何使用[`setup_actors`](performance-schema-setup-actors-table.html)表来控制这些列，请参阅[第 27.4.6 节，“按线程预过滤”](performance-schema-thread-filtering.html).

[](<>)

从中删除行[`线程`](performance-schema-threads-table.html)表在线程结束时出现。对于与客户端会话关联的线程，会话结束时会发生删除。如果客户端启用了自动重新连接并且会话在断开连接后重新连接，则会话将与[`线程`](performance-schema-threads-table.html)有不同的表`PROCESSLIST_ID`价值。最初的`仪表`和`历史`新线程的值可能与原始线程的值不同：[`setup_actors`](performance-schema-setup-actors-table.html)表可能在此期间发生了变化，如果`仪表`要么`历史`在行初始化后更改了原始线程的值，更改不会延续到新线程。

您可以启用或禁用线程监控（即是否检测线程执行的事件）和历史事件日志记录。控制初始`仪表`和`历史`新前台线程的值，使用[`setup_actors`](performance-schema-setup-actors-table.html)桌子。要控制现有线程的这些方面，请将`仪表`和`历史`列[`线程`](performance-schema-threads-table.html)表行。（有关线程监控和历史事件记录发生的条件的更多信息，请参阅`仪表`和`历史`列。）

为了比较[`线程`](performance-schema-threads-table.html)名称前缀为的表列`PROCESSLIST_`到其他过程信息源，请参阅[过程信息的来源](processlist-access.html#processlist-sources).

重要的

对于线程信息源以外的[`线程`](performance-schema-threads-table.html)表中，仅当当前用户拥有[`过程`](privileges-provided.html#priv_process)特权。这不是真的[`线程`](performance-schema-threads-table.html)桌子;所有行都显示给拥有[`选择`](privileges-provided.html#priv_select)表的特权。不应该通过访问[`线程`](performance-schema-threads-table.html)表不应该给出[`选择`](privileges-provided.html#priv_select)特权。

这[`线程`](performance-schema-threads-table.html)表有这些列：

-   `THREAD_ID`

    唯一的线程标识符。

-   `姓名`

    与服务器中的线程检测代码关联的名称。例如，`线程/sql/one_connection`对应于代码中负责处理用户连接的线程函数，并且`线程/sql/main`代表`主要的（）`服务器的功能。

-   `类型`

    线程类型，要么`前景`要么`背景`.用户连接线程是前台线程。与内部服务器活动相关的线程是后台线程。示例是内部的`InnoDB`线程、向副本发送信息的“binlog dump”线程以及复制 I/O 和 SQL 线程。

-   `PROCESSLIST_ID`

    对于前台线程（与用户连接相关联），这是连接标识符。这与显示在`ID`的列`INFORMATION_SCHEMA` [`进程列表`](information-schema-processlist-table.html)表，显示在`Id`列[`显示进程列表`](show-processlist.html)输出，并由[`CONNECTION_ID()`](information-functions.html#function_connection-id)线程内的函数。

    对于后台线程（与用户连接无关），`PROCESSLIST_ID`是`空值`，所以值不是唯一的。

-   `PROCESSLIST_USER`

    与前台线程关联的用户，`空值`对于后台线程。

-   `PROCESSLIST_HOST`

    与前台线程关联的客户端的主机名，`空值`对于后台线程。

    不像`主持人`的列`INFORMATION_SCHEMA` [`进程列表`](information-schema-processlist-table.html)表或`主持人`列[`显示进程列表`](show-processlist.html)输出，`PROCESSLIST_HOST`列不包括 TCP/IP 连接的端口号。要从 Performance Schema 获取此信息，请启用套接字检测（默认情况下未启用）并检查[`socket_instances`](performance-schema-socket-instances-table.html)桌子：

    ```
    mysql> SELECT NAME, ENABLED, TIMED
           FROM performance_schema.setup_instruments
           WHERE NAME LIKE 'wait/io/socket%';
    +----------------------------------------+---------+-------+
    | NAME                                   | ENABLED | TIMED |
    +----------------------------------------+---------+-------+
    | wait/io/socket/sql/server_tcpip_socket | NO      | NO    |
    | wait/io/socket/sql/server_unix_socket  | NO      | NO    |
    | wait/io/socket/sql/client_connection   | NO      | NO    |
    +----------------------------------------+---------+-------+
    3 rows in set (0.01 sec)

    mysql> UPDATE performance_schema.setup_instruments
           SET ENABLED='YES'
           WHERE NAME LIKE 'wait/io/socket%';
    Query OK, 3 rows affected (0.00 sec)
    Rows matched: 3  Changed: 3  Warnings: 0

    mysql> SELECT * FROM performance_schema.socket_instances\G
    *************************** 1. row ***************************
               EVENT_NAME: wait/io/socket/sql/client_connection
    OBJECT_INSTANCE_BEGIN: 140612577298432
                THREAD_ID: 31
                SOCKET_ID: 53
                       IP: ::ffff:127.0.0.1
                     PORT: 55642
                    STATE: ACTIVE
    ...
    ```

-   `PROCESSLIST_DB`

    线程的默认数据库，或`空值`如果没有选择。

-   `PROCESSLIST_COMMAND`

    对于前台线程，线程代表客户端执行的命令类型，或`睡觉`如果会话空闲。有关线程命令的说明，请参见[第 8.14 节，“检查服务器线程（进程）信息”](thread-information.html).该列的值对应于`COM_*`xxx`*`客户端/服务器协议的命令和`Com_*`xxx`*`状态变量。看[第 5.1.10 节，“服务器状态变量”](server-status-variables.html)

    后台线程不代表客户端执行命令，所以本专栏可能是`空值`.

-   `PROCESSLIST_TIME`

    线程处于当前状态的时间（以秒为单位）。对于副本 SQL 线程，该值是上次复制事件的时间戳与副本主机的实际时间之间的秒数。看[第 17.2.3 节，“复制线程”](replication-implementation-details.html).

-   `PROCESSLIST_STATE`

    指示线程正在做什么的动作、事件或状态。对于描述`PROCESSLIST_STATE`值，见[第 8.14 节，“检查服务器线程（进程）信息”](thread-information.html).如果值如果`空值`，线程可能对应于一个空闲的客户端会话，或者它正在做的工作没有使用阶段进行检测。

    大多数状态对应于非常快速的操作。如果一个线程在给定状态下停留数秒，则可能存在需要调查的问题。

-   `PROCESSLIST_INFO`

    线程正在执行的语句，或`空值`如果它不执行任何语句。如果该语句执行其他语句，则该语句可能是发送到服务器的语句，或者是最内层的语句。例如，如果一个`称呼`语句执行正在执行的存储过程[`选择`](select.html)声明`PROCESSLIST_INFO`值显示[`选择`](select.html)陈述。

-   `PARENT_THREAD_ID`

    如果这个线程是一个子线程（由另一个线程产生），这是`THREAD_ID`生成线程的值。

-   `角色`

    没用过。

-   `仪表`

    是否检测线程执行的事件。值为`是的`要么`不`.

    -   对于前台线程，初始`仪表`值取决于与线程关联的用户帐户是否与线程中的任何行匹配[`setup_actors`](performance-schema-setup-actors-table.html)桌子。匹配基于的值`PROCESSLIST_USER`和`PROCESSLIST_HOST`列。

        如果线程产生子线程，则匹配再次发生[`线程`](performance-schema-threads-table.html)为子线程创建的表行。

    -   对于后台线程，`仪表`是`是的`默认。[`setup_actors`](performance-schema-setup-actors-table.html)未咨询，因为没有后台线程的关联用户。

    -   对于任何线程，它的`仪表`值可以在线程的生命周期内更改。

        为了监视线程执行的事件发生，这些事情必须是真实的：

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

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

    -   仅对从具有`已启用`列设置为`是的`在里面[`setup_instruments`](performance-schema-setup-instruments-table.html)桌子。

-   `历史`

    是否记录线程的历史事件。值为`是的`要么`不`.

    -   对于前台线程，初始`历史`值取决于与线程关联的用户帐户是否与线程中的任何行匹配[`setup_actors`](performance-schema-setup-actors-table.html)桌子。匹配基于的值`PROCESSLIST_USER`和`PROCESSLIST_HOST`列。

        如果线程产生子线程，则匹配再次发生[`线程`](performance-schema-threads-table.html)为子线程创建的表行。

    -   对于后台线程，`历史`是`是的`默认。[`setup_actors`](performance-schema-setup-actors-table.html)未咨询，因为没有后台线程的关联用户。

    -   对于任何线程，它的`历史`值可以在线程的生命周期内更改。

        对于要发生的线程的历史事件日志记录，这些事情必须是真实的：

    -   适当的历史相关消费者[`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)桌子。

-   `连接类型`

    用于建立连接的协议，或`空值`用于后台线程。允许的值为`TCP/IP`（未加密建立的 TCP/IP 连接），`SSL/TLS`（使用加密建立的 TCP/IP 连接），`插座`（Unix套接字文件连接），`命名管道`（Windows 命名管道连接），以及`共享内存`（Windows 共享内存连接）。

-   `THREAD_OS_ID`

    底层操作系统定义的线程或任务标识符（如果有）：

    -   当 MySQL 线程在其生命周期内与同一个操作系统线程相关联时，`THREAD_OS_ID`包含操作系统线程 ID。

    -   当 MySQL 线程在其生命周期内不与同一个操作系统线程关联时，`THREAD_OS_ID`包含`空值`.当使用线程池插件时，这对于用户会话来说是典型的（参见[第 5.6.3 节，“MySQL 企业线程池”](thread-pool.html)）。

        对于 Windows，`THREAD_OS_ID`对应于 Process Explorer 中可见的线程 ID (<https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx>）。

        对于 Linux，`THREAD_OS_ID`对应的值`gettid()`功能。例如，使用**性能**要么**ps -L**命令，或在`过程`文件系统 （`/proc/*`[pid]`*/任务/*`[时间]`*`）。有关详细信息，请参阅`性能统计(1)`,`附言(1)`， 和`过程（5）`手册页。

-   `RESOURCE_GROUP`

    资源组标签。这个值是`空值`如果当前平台或服务器配置不支持资源组（请参阅[资源组限制](resource-groups.html#resource-group-restrictions)）。

    这[`线程`](performance-schema-threads-table.html)表有这些索引：

-   主键打开 (`THREAD_ID`)

-   索引 (`姓名`)

-   索引 (`PROCESSLIST_ID`)

-   索引 (`PROCESSLIST_USER`, `PROCESSLIST_HOST`)

-   索引 (`PROCESSLIST_HOST`)

-   索引 (`THREAD_OS_ID`)

-   索引 (`RESOURCE_GROUP`)

[`截断表`](truncate-table.html)不允许[`线程`](performance-schema-threads-table.html)桌子。
