前言
对于JVM引起的CPU过高的问题,已经有很多解决套路了,本文再来分析一下如果是MySQL服务CPU过高应该如何排查!
定位CPU过高的原因
可以通过vmstat进行排查,关注用户空间(us)、系统空间(sy)、IO等待(wa)、软硬中断(in)、空闲(id),而系统空间(sy)、软硬中断(in)一般我们也控制不了,所以主要围绕us、wa、id来分析。
用户空间消耗
那有可能是存在大量的函数计算、排序等类似的操作
IO等待
那有可能是慢查询过多,或者并发量过高。
关于如何优化
其实对于MySQL而言,不像我们自己写的应用程序,你可能还需要排查代码bug,或者代码质量等原因,一般我们要做的就是参考一些大厂的SQL规范,再结合自己的业务特点,合理设计即可。
表设计优化
现在的微服务架构体系,不能完全按照三范式进行设计,有时候还需要一些反范式的设计,比如:如果把一个不经常发生改变的字段冗余起来,就能避免之后的RPC的调用,那还是值得的,又或者你一定听说过全局表的概念。
字段类型要合理
比如:如果tinyint够使用的就不要用int,varchar(16)够的就不要用varchar(255)(默认是255,有些人也不修改)。
更小的数据类型也就意味着占用的磁盘空间更小,内存一次缓存的数据就越多,cpu一次处理的速度就更快。
注意隐式转换问题
查询参数的类型不要和数据库字段的类型不一致,否则还需要调用函数进行一次类型转换的过程
函数的运算
可以把大量的函数运算放在应用服务端完成
索引
优化索引的选择,适当、合理的建立索引,禁止建立不必要的索引,索引过多会造成修改、插入、删除操作变慢。
总结
当然除了这些优化点之外,再往上看,单台服务总是存在瓶颈的,所以分库分表、读写分离、应用级别的缓存、减少重复的SQL请求等等都是需要考虑的问题。