MySQL之短时间提高性能的措施

前言

我们在使用数据库的时候,总会有那么一段时间,数据库的压力会特别大。比如,用户的使用的高峰期,或者活动上线的时候等等。那么为了应对突然暴增的数据库压力,我们应该怎么应对呢。首先我们需要分析下导致压力暴增的原因,然后制定相应的措施即可。

短连接风暴

短连接的数量在某一时刻突然暴增,这会给数据库造成很大的压力。当遇到这种情况的时候,我们大致有三种种处理方法

1.关闭数据的权限校验这一块,直接连接数据库。虽然说权限校验这一块,对性能很小,但是当连接数很大的时候,也是一笔不小的性能开销。但是这个操作非常危险,不建议使用。

2.杀死短连接。通过kill connection 主动踢掉一些空闲的短连接。
在这里插入图片描述
如上图,如果sessionA和sessionB都是sleep状态的空闲连接,我们首先选择肯定是杀死sessionB这种的,因为杀死B这种的短连接不需要事务的回滚。A的话,你杀死这样的连接之后,还需事务回滚,将数据还原。
怎么判断那个是事务外空闲的连接呢。你可以查 information_schema 库的 innodb_trx 表来进行判断。
如果杀死事务外空闲的短连接还不够,那么你就可以考虑杀死事务内空闲的连接。

3.就是调高 max_connections 的值,我们知道数据库的连接数,是由一定数量的,我们可以通过max_connections 参数设置。但是这个也有一个风险就是你设置的过大的话,可能会导致连接上了,但是这个连接迟迟拿不到cpu的资源,倒是进一步加大服务器资源的占用。

慢查询

导致慢查询大致有三种情况
1.索引没选对
2.sql写的有问题
3.索引失效了
对此我们有以下三种对应的解决方法

(1)索引失效,我们可以通过alter table ,添加索引解决,现在的是数据库版本基本都支持online ddl,只要不是特别老的版本。
(2)sql写的有问题的话

insert into query_rewrite.rewrite_rules(pattern, replacement, pattern_database) values ("select * from t where id + 1 = ?", "select * from t where id = ? - 1", "db1");call query_rewrite.flush_rewrite_rules();

我们可以通过重写sql,如上图,写一个存储过程,里面写一个你要替换的sql,然后在执行慢查询的sql 的时候,可以执行上面的sql将慢查询的sql替换成你重写的sql。

(3) 索引失效
这个我们这不详细展开介绍了,之前的文章有详细的介绍索引失效的场景,原因和解决方案。这里我们就直接使用for index这种最为直接的解决方案。

QPS(每秒查询数)突增

QPS突然暴增的情况,基本优化方案没有,没有什么短时间应急的优化方案(这个建议前提是在你的表设计的没有问题,索引也没有问题的情况下)。当然你也可以选择上面那种重写sql,统一返回select1,但是这个功能基本就无法使用了。
但是如果你是新增的业务,且这个业务不是那么重要的话,你可以选择,将这个业务从数据库白名单踢出,或者删除这个业务的用户,这样也可以。

总结

上面介绍的方法基本都是一些应急的方案,不是长远考虑的(就是你领导说,我不管你用什么方法先让程序能正常运行,我们采用的一些应急方案),所以你们想要彻底解决问题,还的深入研究,找到问题所在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark---小鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值