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

面试官:如果MySQL导致CPU消耗过大,你会怎么优化?

时间:2023-03-19 14:07:34 科技观察

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