MySQL 活跃线程数优化

活跃线程数或活跃连接数是评估 MySQL 负载状态的重要指标。一般来说,健康的实例应保持活跃连接数小于 10。对于高规格和高 QPS 的实例,活跃连接数可能达到 20-30。如果活跃连接数超过数百甚至数千,可能会出现 SQL 队列堆积,MySQL 响应时间变慢,甚至导致实例崩溃或无法处理更多 SQL 请求。

查看活跃连接数

您可以通过以下 SQL 语句查看活跃连接数。

show status like 'Threads%';
返回参数说明
Threads_connected打开的连接数
Threads_running活跃连接数,通常远低于连接数

活跃线程数问题的优化建议

慢 SQL 队列堆积

如果发现活跃线程数在增加,应首先执行 show processlist 命令检查慢查询。扫描行数过多的慢查询会导致活跃连接数增加,从而引发性能问题。若需解决性能相关问题,建议终止相关会话以减少影响。

表缓存问题

在高流量或涉及大量表的场景中,表缓存可能不足,导致大量 SQL 语句处于“Opening table”状态。这会显著增加查询延迟和服务器负载,可能引起性能下降或服务器崩溃。

您可以通过提升 table_open_cache 参数来增加表缓存大小,减少处于“Opening table”状态的 SQL 语句数量,从而提升查询性能。但需注意,过度增加该参数会消耗服务器内存,可能引发性能问题。因此,应谨慎调整该参数,以实现最佳性能和稳定性。

元数据锁(MDL)问题

当发生 MDL 锁时,大量 SQL 语句可能处于“Waiting for table metadata lock”状态。DDL 语句在准备和提交阶段需要获取 MDL 锁。如果表上存在未提交事务或慢 SQL,会阻塞 DDL 操作。由于 DDL 操作也会阻塞其他 SQL 操作,可能导致活跃线程数增加。

建议终止未提交事务、慢 SQL 或正在执行的 DDL 操作。

行锁冲突

您可以通过以下 SQL 语句查看相关状态。

show status like 'Innodb_row_lock_%';

行锁冲突表现为 Innodb_row_lock_waitsInnodb_row_lock_time 状态指标的增加,导致活跃线程数上升。

您还可以执行 show engine innodb status 命令,检查是否有大量会话处于“Lock wait”状态。如果存在大量等待,说明行锁冲突严重,需要通过热点更新、减少事务大小、及时提交事务等方法进行优化,避免行锁冲突。