文章目录
- 前言
- 短连接风暴
- 慢查询
- QPS(每秒查询数)突增
- 总结
前言
我们在使用数据库的时候,总会有那么一段时间,数据库的压力会特别大。比如,用户的使用的高峰期,或者活动上线的时候等等。那么为了应对突然暴增的数据库压力,我们应该怎么应对呢。首先我们需要分析下导致压力暴增的原因,然后制定相应的措施即可。
短连接风暴
短连接的数量在某一时刻突然暴增,这会给数据库造成很大的压力。当遇到这种情况的时候,我们大致有三种种处理方法
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,但是这个功能基本就无法使用了。
但是如果你是新增的业务,且这个业务不是那么重要的话,你可以选择,将这个业务从数据库白名单踢出,或者删除这个业务的用户,这样也可以。
总结
上面介绍的方法基本都是一些应急的方案,不是长远考虑的(就是你领导说,我不管你用什么方法先让程序能正常运行,我们采用的一些应急方案),所以你们想要彻底解决问题,还的深入研究,找到问题所在。