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

MySQL造成的CPU消耗太大,请问如何优化?

时间:2023-03-12 08:38:17 科技观察

谁在消耗cpu?用户+系统+IO等待+软硬中断+空闲的罪魁祸首是谁?用户空间CPU消耗,各种逻辑运算正在进行大量的tps函数/排序/类型转换/逻辑IO访问...用户空间消耗大量cpu,产生了哪些系统调用?哪些函数使用cpu周期?IO等待IO请求完成。这个时候CPU其实是空闲的,比如vmstat中的wa很高。但是IO等待增加,wa不一定增加(请求I/O后等待响应,但是进程被移出核心),影响用户,IO等待消耗大部分cputhroughputdrops(tps)query响应时间增加慢查询数量的增加,会导致mysql的并发量急剧增加,这也会产生吸引力。如何降低CPU消耗?减少等待和减少IOSQL/索引量,使用合适的索引减少扫描行数(需要平衡索引的正收益和维护成本,空间换时间)提高IO处理能力添加缓存/添加磁盘/SSD减少计算量,减少逻辑运算量避免使用函数,将操作转移到易于扩展的应用服务器上,例如substr等字符操作,dateadd/datesub等日期操作,abs等数学函数,减少排序,使用索引获取有序数据或避免不必要的排序如unionall代替union,orderbyindexfields等禁止类型转换,使用合适的类型并保证传入参数的类型与数据库字段的类型绝对一致,比如numbers的tiny/int/bigint等,在应用程序中转换简单类型再传入数据库。尽量避免复杂类型,减少复杂类型带来的额外操作。更小的数据类型占用更少的磁盘、内存、cpu缓存和cpu周期...减少逻辑IO索引量,优化索引,减少不必要的表扫描,如添加索引、调整复合索引字段的顺序、去除选择性表比如索引字段差,合理拆分,适度冗余,比如把很少用到的大字段拆分成独立的表,非常频繁的小字段冗余到“引用表”SQL,调整SQL写法,充分利用现有索引,避免不必要的扫描,排序等操作比如减少复杂的join,减少orderby,尽量unionall,避免子查询等数据类型,就够了,减少不必要的大字段比如tinyint就够了不要总是int,int就够了,不要老是bigint,date就够了,不要老是timestamp。。。减少查询请求量(不是数据库本身)适当的缓存,降低缓存数据的粒度,对于static和frequ对请求的数据进行适当的缓存,如用户信息、商品信息等,优化实现,尽量杜绝不必要的重复请求,如禁止在同一页面重复请求相同数据,传递跨页面参数,减少访问等合理需求,评估需求产出比,合理去除极底产出比需求...升级cpu如果减少计算减少等待后仍不能满足需求,则cpu利用率还是highT_T是时候拿出最后的王牌了,升级cpu是Fastercpu还是morecpu的选择?低延迟(快速响应),需要更快的cpu(每个查询只能使用一个cpu)高吞吐量,同时运行许多查询,可以受益于多个cpu处理查询