mysql关于cpu占用100%问题的思考

  CPU高说明计算机在执行大量的计算,很大可能是查询执行时因索引建立不合理或sql语句书写效率低下,mysql发生了大量的连接查询、条件判断等,需要处理的记录数过大。

  此时,可以通过建立合理的索引或者改写sql语句达到降低CPU的目的。

  今天遇到的例子:1)要查询的日志表读写比较频繁,优化时,先对该表进行统计形成小时表和日表,然后根据业务来看,6个月内的数据并不要求很准确,故查询日表,避免了查询更新较为频繁的日志表,使用了更新较少,且数据量较少的日表。2)查询关联了用户角色表,筛选出去了角色是教师的用户,去统计学生的数据,因为教师数量相比学生数量很少,故优化时删除了这个关于用户角色的关联查询,减轻了连表查询的代价。数据虽有不是特别准确,但是基本满足条件。

  思考:关于用户角色筛选的问题,按理可以在日志表加上用户的角色标识作为冗余字段,查询时仅需要通过该字段判断角色即可,无需再关联用户角色表。

 

 

1. show full PROCESSLIST ;


SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

 

  多次执行 show full processlist ,根据这一时刻发生的sql语句,看看频繁出现的是哪些 sql;也可以手动停止一部分,再停止另一部分的方式,排除法的方式判断出是哪句 sql 有问题,然后根据具体业务对其进行优化。

 

2. 监测慢 sql 

  频繁创建临时表(连接、排序、函数、返回字段过多、不走索引全表扫描)也会消耗大量 cpu ,这个可能在上一步能找的出对应的 sql,也可以在慢查询里找的到有问题的 sql 语句。

  

3. 参数 tmp_table_size 值修改

  临时表大小一般32M,将其扩大可能可以改善 cpu 高的问题。

posted @ 2022-07-18 12:28  停不下的时光  阅读(1503)  评论(0编辑  收藏  举报