当前位置: 首页 > 科技观察

MySQL导致CPU消耗过大,如何优化

时间:2023-03-14 14:37:52 科技观察

谁在消耗CPU?用户+系统+IO等待+软硬中断+空闲谁是罪魁祸首?用户空间CPU消耗,各种逻辑操作正在进行大量tps函数/排序/类型转换/逻辑IO访问...IO等待IO请求完成。这个时候CPU其实是空闲的,比如vmstat中的wa很高。但是IOwait增加了,wa不一定会增加(请求I/O后等待响应,但是进程从core中移除)。影响用户和IO等待会消耗大部分cpu。吞吐量(tps)的下降,查询响应时间的增加,慢查询数量的增加,MySQL并发量的突然增加,也会产生上述影响。如何降低CPU消耗?减少等待减少IOSQL/索引量,使用合适的索引减少扫描行数(需要平衡索引的正收益和维护成本,空间换时间)。提高IO处理能力,增加缓存/增加磁盘/SSD,减少计算量,减少逻辑操作,避免使用函数,将操作转移到易于扩展的应用服务器,如substr等字符操作,dateadd/datesub等日期操作,以及abs等数学函数减少排序,使用索引获取有序数据或避免不必要的排序,如unionall代替union,orderbyindexfield等。禁止类型转换,使用合适的类型并保证类型传入参数的类型与数据库字段的类型绝对一致,比如numbers的tiny/int/bigint等。对于必须转换的,先在应用中转换简单类型再传入数据库,尽量避免复杂类型,减少复杂类型带来的额外操作。更小的数据类型占用更少的磁盘、内存、cpu缓存和cpu周期....减少逻辑IO索引量,优化索引,减少不必要的表扫描,如添加索引、调整复合索引字段的顺序、删除选择性差索引字段等表,拆分合理,适度冗余。例如,将很少使用的大字段拆分成独立的表,而非常频繁的小字段对“引用表”SQL来说是多余的,调整SQL的写法,充分利用已有的Index,避免不必要的扫描、排序等操作,减少复杂度joins,reducingorderby,尽量unionall,避免子查询等其他数据类型,用够就好,减少不必要的使用tinyint等大字段就够了,不要总是int,int够用也不要老bigint、date就够了,不要总是timestamp....减少查询请求量(不是数据库本身)适当缓存,降低缓存数据的粒度,适当缓存静态和频繁请求的数据,比如用户信息、商品信息等优化实现,尽量去掉不必要的重复请求,比如禁止多次重复请求同一个页面的同一个数据,传递跨页参数减少访问和其他合理需求,评估需求产出比,比较产出去除极底需求是合理的....升级cpu。如果减少计算减少等待后仍不能满足需求,则cpu利用率仍然很高。或者更多的cpu?参考《高性能MySQL》《图解性能优化》大部分整理自?