Mysql CPU使用率长期100%的解决思路备忘

Posted aieceo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql CPU使用率长期100%的解决思路备忘相关的知识,希望对你有一定的参考价值。

最近一台服务器的CPU使用率长期保持在100%的状态,查看进程发现是mysql服务导致的。于是搜索各方资料,终于成功解决问题。备忘以及分享一下,希望可以帮助各位新手朋友。

 

(服务器运行环境是Windows server2008,Linux思路类似。只是命令行工具不同。)

 

首先通过cmd 输入 mysql -h localhost -u root -p 回车进入mysql数据库

通过 show processlist; 指令查看当前 mysql 使用频繁的 sql 语句

反复调用此命令发现经常出现多个类似的select语句

经过排查发现是where子句中的条件判断中用到的字段没有建立索引, MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。

 

ALTER TABLE `表名称` ADD INDEX `字段名称` ;

通过上方语句创建相关字段的索引后CPU立马下降到20%左右。成功解决问题。

小Tips:phpmyadmin中通过表结构“操作”列表中的“索引”按钮创建索引更方便处理,比较适合懒人操作,点一下鼠标即可解决  (* ̄︶ ̄)

 

总结:

对 WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的条件判断中用到的字段,应该根据其建立索引 INDEX。索引被用来快速找出在一个列上用一特定值的行。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。

如果一个表有1000行,这比顺序读取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。

根据 mysql 的开发文档,索引 index 用于:

1,快速找出匹配一个WHERE子句的行  
2,当执行联结(JOIN)时,从其他表检索行。  
3,对特定的索引列找出MAX()或MIN()值  
4,如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。  
5,在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。  

 

以上是关于Mysql CPU使用率长期100%的解决思路备忘的主要内容,如果未能解决你的问题,请参考以下文章

mysql经常占用cpu100%以上,该怎么解决

mysql cpu 100% 满 优化方案 解决MySQL CPU占用100%的经验总结

追踪Redis Sentinel的CPU占有率长期接近100%的问题 二

CPU100%问题快速定位思路

系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路

如何诊断和解决CPU高度消耗(100%)的数据库