Mysql 负载过高

在 Github 上修改

昨天渠道推了一波用户,大概用户新增3~4w左右,网站基本上动不了了,分析过他的流量后发现不是流量暴增或者黑客攻击引起的。

登录服务器发现CPU 爆满,mysql 占 %100 ~ %100 上下,登录 mysql 发现查询根本进行不下去,平均一个 sql 运行 2s+。

用 show processlist 查看mysql正在执行的线程。发现大量的sleep和超时的线程,kill掉所有sleep的或者超时的线程。但发现连接数马上又暴增。仔细观察一些超时的连接所执行的 SQL 语句,发现跟它的user表相关的查询超时的情况特别多。 使用check table user发现表并没有损坏。

查看 QPS 和 TPS 发现不是很高,以现在服务器的配置完全可以支撑的

# QPS - Queries Per Second(每秒查询处理量) 同时使用与innoDB和myISAM
use information_schema;
select VARIABLE_VALUE into @num_queries from GLOBAL_STATUS where VARIABLE_NAME ='QUESTIONS';
select VARIABLE_VALUE into @uptime from GLOBAL_STATUS where VARIABLE_NAME ='UPTIME';
select @num_queries/@uptime;
# TPS - Transactions Per Second(每秒传输的事物处理个数) 仅限于innoDB
use information_schema;
select VARIABLE_VALUE into @num_com from GLOBAL_STATUS where VARIABLE_NAME ='COM_COMMIT';
select VARIABLE_VALUE into @num_roll from GLOBAL_STATUS where VARIABLE_NAME ='COM_ROLLBACK';
select VARIABLE_VALUE into @uptime from GLOBAL_STATUS where VARIABLE_NAME ='UPTIME';
select (@num_com+@num_roll)/@uptime

接下来查询 mysql 慢日志 ,发现有一条 SQL 运行特别慢,用 explain 查看这条 SQL 语句的执行计划,因为是组合索引,所以命中率不高,还有全表扫描,接下来修改 SQL 索引类型 ,限制没必要的全表查询,CPU 降下来到 %70 左右。

读写比,优化数据库的重要依据,读的多就去优化读,写的多就去优化写 ,开启查询索引

查看查询缓存情况:

mysql> show variables like ‘%query_cache%’;

 (query_cache_type 为 ON 表示已经开启)
 +------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 20971520 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+ 

如果不是ON,修改配置文件以开启查询缓存:

vi my.cnf

[mysqld]中添加:

query_cache_size = 64M

query_cache_type = ON

然后重启生效

查看缓存使用情况:

mysql> show status like ‘qcache%’;

开启查询缓存后 CPU 总算降下来了~