rds mysql 优化_阿里云RDS优化MySQL,解决数据库CPU占用高

通过登录RDS数据库,分析发现SQL效率问题是导致CPU占用高的原因。通过实时性能监控,定位到频繁执行的慢SQL,尤其是全表扫描操作。针对datediff函数未触发索引和子查询不利用索引的问题,提出优化策略:改写datediff条件以利用索引,以及避免子查询中的in操作,转而使用JOIN来提升查询效率。
摘要由CSDN通过智能技术生成

登录RDS数据库

第一步先看MYSQL的性能状况,分析是设置问题还是SQL效率问题

使用实例信息/实时性能

ef1560c98393a49722e9ace862d9de30.png

发现read数据比较高,同时发现数据库CPU占用较高

再通过实时回话观察使用频繁的SQL,并且较慢的SQL

e6bcf981962308f8dd18552793223c80.png

在诊断报告中也可以找出慢SQL,优先解决执行次数多的慢SQL,有些报表只执行了1-2次可以不用关注。

将慢SQL在SQL执行窗口中执行,并查看执行计划

98781469ec86cf8074e9f4d54929981f.png

对于这种TYPE=ALL全表扫描的返回rows很多的就需要进行优化

这次优化主要发现两个地方:

1. MySQL中datediff函数不会触发日期字段的索引,and datediff(stock.stockDate,:sDate) = 0 需要改成 stock.stockDate >= :sDate and stock.stockDate

2. MySQL中in (select id from table where table.id = ?) 这种也可能不会触发索引,例如:

AND labels.LEG_ID IN (SELECT leg.id FROM tms_leg leg WHERE leg.shipment_id = (SELECT tl.shipment_id FROM tms_leg tl WHERE tl.id = ?))

改成

select * from labels, (SELECT leg.id FROM tms_leg leg WHERE leg.shipment_id = (SELECT tl.shipment_id FROM tms_leg tl WHERE tl.id = ?)) tt where labels.LEG_ID=tt.id

或者

select * from labels, tms_leg t1,tms_leg t2 where  t1.shipment_id = t2.shipment_id and t1.id = labels.leg_id and t2.id = ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值