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