{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2025-05-04 11:15:07","updateBy":"admin","updateTime":"2025-05-04 11:15:07","remark":null,"params":{"@type":"java.util.HashMap"},"id":110,"articleTitle":"MySQL（十八）SHOW PROCESSLIST","articleUrl":"mysql_processlist","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/9e192744fab244d39d3b15fca035c9f7.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"0","articleSummary":"SHOW PROCESSLIST是 MySQL 中一个非常实用的命令，用于查看当前数据库服务器上正在运行的所有**线程（连接）**的状态信息。这对于诊断性能问题、识别长时间运行的查询、查找阻塞进程或简单地了解当前数据库负载非常有用。","articleContent":"`SHOW PROCESSLIST` 是 MySQL 中一个非常实用的命令，用于查看当前数据库服务器上正在运行的所有**线程（连接）**的状态信息。这对于诊断性能问题、识别长时间运行的查询、查找阻塞进程或简单地了解当前数据库负载非常有用。\n\n它的输出是一个表格，包含以下关键列：\n\n1.  **`Id`**:\n    *   **含义**: 线程的唯一标识符（连接ID）。这是连接在服务器内部的标识。\n    *   **重要性**: 用于识别特定的连接。如果需要终止一个连接（使用 `KILL <id>` 命令），就需要用到这个ID。\n\n2.  **`User`**:\n    *   **含义**: 建立该连接的 MySQL 用户名。\n    *   **重要性**: 帮助你了解是哪个用户或应用程序在执行操作。例如，区分应用服务器用户、管理用户、报表用户等。\n\n3.  **`Host`**:\n    *   **含义**: 发起该连接的客户端的主机名或IP地址（以及客户端端口）。\n    *   **重要性**: 定位连接的来源机器。这对于识别哪个应用服务器或特定客户端在运行查询至关重要。格式通常是 `hostname:port` 或 `ip:port`。\n\n4.  **`db`**:\n    *   **含义**: 线程当前默认使用的数据库（即 `USE` 语句选中的数据库）。如果线程没有选择任何数据库，则为 `NULL`。\n    *   **重要性**: 快速知道操作发生在哪个数据库上。\n\n5.  **`Command`**:\n    *   **含义**: 线程当前正在执行的命令类型。\n    *   **常见值及其重要性**:\n        *   `Sleep`: 线程处于空闲状态，等待客户端发送新的命令。**非常常见**，表示连接空闲。\n        *   `Query`: 线程正在**执行一个查询语句**（`SELECT`, `INSERT`, `UPDATE`, `DELETE`, `SHOW`, `SET` 等）。这是你最需要关注的。\n        *   `Connect`: 客户端正在连接到服务器。\n        *   `Init DB`: 线程正在选择（`USE`）一个数据库。\n        *   `Field List` (或 `Binlog Dump` 等): 内部命令或特定功能的命令（如复制）。\n        *   `Daemon`: 服务器内部线程（如复制线程、事件调度器线程）。\n        *   `Killed`: 线程已被标记为终止，正在清理资源。\n        *   `Time`: 线程处于当前状态已经持续的时间（秒）。\n    *   **重要性**: 这是理解线程在**做什么**的核心列。`Query` 表示正在执行SQL，`Sleep` 表示空闲，其他值表示连接建立或内部状态。\n\n6.  **`Time`**:\n    *   **含义**: 线程处于当前状态已经持续的时间（以秒为单位）。\n    *   **重要性**:\n        *   对于 `Query` 状态：表示查询**已经执行了多长时间**。这是识别**慢查询**或**长时间运行查询**的关键指标。数值越大，查询运行时间越长。\n        *   对于 `Sleep` 状态：表示连接**空闲了多长时间**。可以帮助识别长时间空闲的连接，这些连接可能占用了连接池资源但未被释放。\n        *   对于其他状态：表示该状态持续的时间。\n\n7.  **`State`**:\n    *   **含义**: 表示线程正在进行的更具体的操作或事件。这比 `Command` 更详细地描述了线程在等待什么或做什么。\n    *   **常见值及其重要性 (很多状态是瞬态的)**:\n        *   `Sending data`: 线程正在读取和处理查询的行，并将数据发送给客户端。这是执行查询的核心阶段之一。\n        *   `Sorting result`: 线程正在对结果集进行排序。\n        *   `Locked`: 线程正在**等待表锁**（在MyISAM引擎中常见）。在InnoDB中，通常表现为等待行锁，状态可能更具体（如 `updating`）。\n        *   `Waiting for table metadata lock`: 线程在等待元数据锁（通常与DDL操作如 `ALTER TABLE` 或某些长时间查询冲突有关）。\n        *   `Waiting for <lock_type> lock`: 更具体的等待锁类型（如 `Waiting for global read lock`）。\n        *   `Creating sort index`: 处理 `GROUP BY` 或 `ORDER BY` 时创建内部临时表。\n        *   `Copying to tmp table`: 将结果复制到临时表（常见于需要排序或分组的查询）。\n        *   `Statistics`: 服务器正在计算统计信息以优化查询执行计划。\n        *   `cleaning up`: 线程已完成执行，正在清理资源。\n        *   `NULL`: 通常表示没有特定状态（如 `Sleep` 命令下）。\n    *   **重要性**: 这是**诊断性能瓶颈的关键**。它告诉你线程为什么“卡住”了（例如，在等待锁、I/O、计算结果）。结合 `Time` 列，高 `Time` 值的特定 `State` 能直接指向问题根源（如锁等待、磁盘IO慢）。\n\n8.  **`Info`**:\n    *   **含义**: 线程正在执行的语句（通常是SQL查询）。如果线程没有执行任何语句（如处于 `Sleep` 状态），则为 `NULL`。\n    *   **注意**: 默认情况下，`SHOW PROCESSLIST` 可能只显示 `Info` 字段的前100个字符左右。要查看完整的语句，需要使用 `SHOW FULL PROCESSLIST`。\n    *   **重要性**: **最直接的信息**！如果线程正在执行查询（`Command` 为 `Query`），这里就显示了**具体执行的SQL语句**。这对于识别慢查询、理解当前操作、复制问题语句进行优化或分析阻塞原因至关重要。\n\n**总结解读要点与常见用途：**\n\n1.  **识别慢查询/长事务**：查找 `Command` 为 `Query` 且 `Time` 值很高的行。`Info` 列显示具体SQL。\n2.  **诊断阻塞/锁等待**：\n    *   查找 `State` 包含 `Locked` 或 `Waiting for ... lock` 且 `Time` 值很高的行。\n    *   查找 `State` 为 `Waiting for table metadata lock` 的行。\n    *   结合 `Info` 看这些线程在等待什么操作完成，然后去查找持有锁的线程（可能 `State` 是 `Sending data` 或 `updating` 且 `Time` 也较高）。\n3.  **查看数据库负载**：观察 `Command` 列的分布。大量 `Query` 表示活跃负载，大量 `Sleep` 可能表示连接池配置或应用连接管理问题。\n4.  **定位问题来源**：结合 `User`, `Host`, `db` 确定是哪个应用、哪个服务器、访问哪个数据库的操作导致了问题。\n5.  **分析连接空闲情况**：`Command` 为 `Sleep` 且 `Time` 很高，表示连接空闲很久，可能连接池未正确释放或配置过大。\n6.  **终止问题进程**：找到问题线程的 `Id`，使用 `KILL <id>` 命令强制终止该连接（谨慎使用！）。\n7.  **识别内部线程**：`Command` 为 `Daemon` 通常是复制线程、事件调度器等。\n\n**重要提示：**\n\n*   **权限**：需要 `PROCESS` 权限才能运行 `SHOW PROCESSLIST`。普通用户通常只能看到自己发起的连接。`SUPER` 或管理员权限可以看到所有连接。\n*   **瞬态信息**：`SHOW PROCESSLIST` 显示的是**执行命令瞬间**的快照。状态变化很快，看到的 `State` 可能在你看到时已经改变。\n*   **`SHOW FULL PROCESSLIST`**：务必使用这个命令来获取完整的 `Info` 字段（完整的SQL语句），否则长SQL会被截断。","categoryId":4,"viewCount":116,"categoryName":"MySQL","author":"球接子","authorAvatar":null,"tagIds":[2,17],"tagNames":["MySQL","数据库"]}}