• MySQL学习笔记5——优化问题(短连接,慢查询,QPS激增)


    短连接风暴

    正常的短连接模式就是连接到数据库后,执行很少的SQL语句就断开,下次需要的时候再重连
    如果使用的是短连接,在业务高峰期的时候,就可能出现连接数突然暴涨的情况。

    解决方法:(有损)

    1. 处理掉占用连接却不工作的线程,设置wait_timeout参数表示的是,一个线程空闲wait_timeout这么多秒之后,就会被MySQL直接断开连接。如果是连接数过多,你可以优先断开事务外空闲太久的连接;如果这样还不够,再考虑断开事务内空闲太久的连接。注意服务端主动断开连接,客户端并不会马上知道,直到客户端下一次发送请求,所以要及时通知客户端
    2. 减少连接过程的消耗——让数据库跳过权限验证阶段。

    慢查询

    在MySQL中,会引发性能问题的慢查询,大体有以下三种可能:

    1. 索引没有设计好;
    2. SQL语句没写好;
    3. MySQL选错了索引。

    1.索引设计问题
    可以创建online DDL,直接执行alter table,比较理想的是能够在备库先执行。假设你现在的服务是一主一备,主库A、备库B,这个方案的
    大致流程是这样的:

    1. 让备库B不再写bin_log,执行alter table加上索引。
    2. 执行主备切换
    3. 这时B变成主库,A是备库,在A上同样关闭bin_log,执行alter table加上索引

    2.语句没写好
    可能的情况:

    1. 索引字段做了函数计算,导致用不上索引。对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。
    2. 隐式类型转换,比如id的类型从string到int。在MySQL中,字符串和数字做比较的话,是MySQ将字符串转换成数字。而对优化器来说,这个转换是调用了函数,同上,对索引字段做了函数操作,优化器放弃走树索引。
    3. 隐式字符编码转换。两张表字符集,一个是utf8,一个是utf8mb4,做表连接查询的时候用不上关联字段的索引。当这两个类型的字符串在做比较的时候,MySQL内部的操作是,先把utf8字符串转成utf8mb4字符集,再做比较。

    解决方法:
    改写SQL语句来处理。MySQL 5.7提供了查询重写query_rewrite功能,可以把输入的一种语句改写成另外一种模式。添加一些模式,把一些容易误写的模式改成正确的。call query_rewrite.flush_rewrite_rules()这个存储过程,是让插入的新规则生效,也就是我们说的“查询重写”。你

    3.MySQL选错索引
    没有使用强制索引force index,可能导致MySQL用错索引。

    优化器的逻辑首先是扫描行数多少,而后结合是否用临时表,是否需要排序等因素综合判断。最主要的问题在于无法准确判断预计扫描行数

    解决方法:使用查询重写功能,给原有语句加上force index

    QPS激增

    如果是上了一个新功能的bug引起,最理想的情况,我们要用最小的代价停掉这个功能。
    如果DB运维比较规范,白名单是逐个添加的,此时如果业务方确定会下掉这个功能,可以从数据库端先把其从白名单踢出去。
    如果新功能使用的是单独数据库的用户,可以把这个用户删掉,然后断开现有连接。

  • 相关阅读:
    UTF-16编码原理讲解
    [附源码]Python计算机毕业设计SSM家政服务系统(程序+LW)
    基于SuperMap iObjects C++之地形通视分析
    MFC创建翻译界面(国际化)
    计算机毕设(附源码)JAVA-SSM基于的宿舍楼跳蚤市场管理系统
    Apache POI
    怎样更改linux的用户名
    Minio分布式集群部署——Swarm
    关于基环树找环问题
    xgboost early_stop_rounds是如何生效的?
  • 原文地址:https://blog.csdn.net/xystrive/article/details/125508577