活跃线程数或活跃连接数是评估 MySQL 负载状态的重要指标。一般来说,健康的实例应保持活跃连接数小于 10。对于高规格和高 QPS 的实例,活跃连接数可能达到 20-30。如果活跃连接数超过数百甚至数千,可能会出现 SQL 队列堆积,MySQL 响应时间变慢,甚至导致实例崩溃或无法处理更多 SQL 请求。
您可以通过以下 SQL 语句查看活跃连接数。
| 返回参数 | 说明 |
|---|---|
| Threads_connected | 打开的连接数 |
| Threads_running | 活跃连接数,通常远低于连接数 |
如果发现活跃线程数在增加,应首先执行 show processlist 命令检查慢查询。扫描行数过多的慢查询会导致活跃连接数增加,从而引发性能问题。若需解决性能相关问题,建议终止相关会话以减少影响。
在高流量或涉及大量表的场景中,表缓存可能不足,导致大量 SQL 语句处于“Opening table”状态。这会显著增加查询延迟和服务器负载,可能引起性能下降或服务器崩溃。
您可以通过提升 table_open_cache 参数来增加表缓存大小,减少处于“Opening table”状态的 SQL 语句数量,从而提升查询性能。但需注意,过度增加该参数会消耗服务器内存,可能引发性能问题。因此,应谨慎调整该参数,以实现最佳性能和稳定性。
当发生 MDL 锁时,大量 SQL 语句可能处于“Waiting for table metadata lock”状态。DDL 语句在准备和提交阶段需要获取 MDL 锁。如果表上存在未提交事务或慢 SQL,会阻塞 DDL 操作。由于 DDL 操作也会阻塞其他 SQL 操作,可能导致活跃线程数增加。
建议终止未提交事务、慢 SQL 或正在执行的 DDL 操作。
您可以通过以下 SQL 语句查看相关状态。
行锁冲突表现为 Innodb_row_lock_waits 和 Innodb_row_lock_time 状态指标的增加,导致活跃线程数上升。
您还可以执行 show engine innodb status 命令,检查是否有大量会话处于“Lock wait”状态。如果存在大量等待,说明行锁冲突严重,需要通过热点更新、减少事务大小、及时提交事务等方法进行优化,避免行锁冲突。