zoukankan      html  css  js  c++  java
  • MySQL优化5之CPU消耗过高(一条慢SQL拖死整个系统)

    1. 案例:一条慢SQL拖死整个系统

    某天突然发现服务探测接口疯狂告警、同时数据库CPU消耗也告警,最后系统都无法访问;

    起先以为服务出现问题,服务重启后现象依旧;

    后检查数据库发现,大量的慢SQL正在阻塞等待执行:

    查看哪些表被锁:show OPEN TABLES where In_use > 0;

    查询正在执行的SQL,发现大量SQL执行阻塞了几百秒

    select * from information_schema.processlist where db=' db_xxx ' and info is not null;

    直接取出索引的进程ID,拼装成kill语句,取出来执行,干掉阻塞中的索引进程。

    select concat('kill ', id,';') from information_schema.processlist where db='db_xxx ' and info is not null;

    发现干掉一次之后,很快又出现大量的执行阻塞的SQL,而且90%以上都是某一条SQL。

    干掉N次之后仍然不行,还是会出现。。。。。。

    将该条执行的SQL扒出来,针对查询条件,创建了组合索引,SQL阻塞现象消失,

    系统也恢复了正常。。。。。

    2.  CPU的消耗主要在 用户、系统、IO等待、软硬中断、空闲。

    主要针对用户、IO等待进行优化(其他方面较难改变)

    用户:  用户这块主要是用户空间CPU消耗,各种逻辑运算; 比如:正在进行大量tps

    以及函数/排序/类型转化/逻辑IO访问…

    IO等待:等待IO请求的完成

    主要是这两者消耗了大部分的CPU,导致吞吐量下降、查询响应时间增加、慢查询增加。

    3. 减少CPU消耗

    3.1  减少等待

    减少IO量:创建适合的索引,空间换时间,提示慢SQL的执行速度。

    提升IO处理能力:加大cache、加大磁盘/SSD

    3.2 减少计算

    1)  减少逻辑运算:

    避免使用函数,将运算转移至易扩展的应用服务器中

    如substr等字符运算,dateadd/datesub等日期运算,abs等数学函数

    减少排序,利用索引取得有序数据或避免不必要排序

    如union all代替 union,order by 索引字段等

    禁止类型转换,使用合适类型并保证传入参数类型与数据库字段类型绝对一致

    如数字用tiny/int/bigint等,必需转换的在传入数据库之前在应用中转好

    简单类型,尽量避免复杂类型,降低由于复杂类型带来的附加运算。更小的数据类型占用更少的磁盘、内存、cpu缓存和cpu周期

    2) 减少逻辑IO量:

    index,优化索引,减少不必要的表扫描
    如增加索引,调整组合索引字段顺序,去除选择性很差的索引字段等等

    table,合理拆分,适度冗余
    如将很少使用的大字段拆分到独立表,非常频繁的小字段冗余到“引用表”

    SQL,调整SQL写法,充分利用现有索引,避免不必要的扫描,排序及其他操作
    如减少复杂join,减少order by,尽量union all,避免子查询等

    数据类型,够用就好,减少不必要使用大字段
    如tinyint够用就别总是int,int够用也别老bigint,date够用也别总是timestamp

    减少query请求量

    适当缓存,降低缓存数据粒度,对静态并被频繁请求的数据进行适当的缓存
    如用户信息,商品信息等

    优化实现,尽量去除不必要的重复请求
    如禁止同一页面多次重复请求相同数据的问题,通过跨页面参数传递减少访问等

    合理需求,评估需求产出比,对产出比极端底下的需求合理去除

    3.3 升级cpu

    若经过减少计算和减少等待后还不能满足需求,cpu利用率还高,使用杀手锏升级cpu(使用更快更多的CPU)

  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/brant/p/12819763.html
Copyright © 2011-2022 走看看