MySQL 活动线程计数优化

活动线程计数或活动连接计数是评估 MySQL 负载状态的重要指标。通常,一个健康的实例应保持活动连接计数低于 10。对于高规格和高 QPS 实例,活动连接计数可能达到 20-30。如果活动连接计数超过数百甚至数千,可能会出现 SQL 排队情况,MySQL 的响应时间可能会减慢,进而导致实例崩溃或无法处理更多的 SQL 请求。

检查活动连接计数

您可以使用以下 SQL 语句查看活动连接计数。

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

活动线程计数问题的优化建议

慢 SQL 排队情况

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

表缓存问题

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

您可以通过提高 table_open_cache 参数来增加表缓存大小,以减少处于“打开表”状态的 SQL 语句数量并改善查询性能。然而,需要谨慎处理,因为过度增加该参数可能会消耗服务器内存并可能导致性能问题。因此,对该参数的调整应谨慎进行以实现最佳性能和稳定性。

元数据锁 (MDL) 问题

当发生 MDL 锁时,大量 SQL 语句可能处于“等待表元数据锁”状态。在 DDL 准备和提交阶段,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 命令检查大量会话是否处于“锁等待”状态。如果有很多,表示行锁冲突严重,需要通过热点更新、减少事务大小及时提交事务等方法进行优化,以避免行锁冲突。