• 深聊MySQL,从入门到入坟之:定位慢SQL的方法还可以这样,小菜鸡都能看懂。


    1、引言

    小鱼:小屌丝,你在干啥呢?出去溜达啊。
    小屌丝:好的,给我10分钟时间,我排查个问题。
    小鱼:好的, 不着急。
    在这里插入图片描述
    小鱼:走啊,再不走 就赶不上2路公共汽车了。
    小屌丝:鱼哥, 再给我几分钟时间,问题还没定位到呢。
    小鱼:啥问题啊,这么难定位。
    小屌丝:就是 有一个慢SQL,但是… 但是 …
    小鱼:不会不知道 如何定位慢SQL??
    小屌丝:额… 确实 … 所以…
    小鱼:我来。

    2、定位慢SQL

    关于慢查询, 我想做性能测试的同学最有感触,也最有发言权。
    一个接口查询20条数据, 命名可以1一秒以内命中, 偏偏搞了30多秒的时间。
    这有没有一种想翩翩起舞的 冲动。

    在这里插入图片描述
    但是,时刻要谨记, 冲动是魔鬼, 所以,切勿冲动。切勿冲动。

    在想冲动的时候,就像小鱼这样,对自己说三句:冷静、冷静、冷静

    接下来,我们就来聊一聊如何快速的定位慢查询。

    2.1 日志定位

    2.1.1 开启阈值

    我们,开发的同学,最常用的定位慢SQL的方式,就是通过日志来定位的。

    MySQL的慢查询日志:

    • 记录响应时间是否超过超过long_query_time设置的值;
    • 扫描记录数是否小于min_examined_row_limit

    注:

    • log_slow_admin_statements:默认 =OFF,即 不会记录管理语句,需要手动开启, =ON
    • log_queries_not_using_indexes:默认 =OFF,即不使用索引语句,需要手动开启 =ON

    2.1.2 操作步骤

    如何使用慢查询日志,进行查询, 只有4步:

    • 1、 开启慢查询;

      • set global slow_query_log = on
    • 2、设置慢查询阈值;

      • set global long_query_time = 1
    • 3、查找慢日志路径;

      • show global variables like "log_path"
    • 4、查找慢日志文件名称;

      • show global variables like "log_filename"

    这里说一下:
    如果你想另辟新路, 使用第三方工具(mysqldumpslow)那也是非常的奈斯。
    关于mysqldumpslow的使用,这里就不过多赘述了。如果对mysqldumpslow 感兴趣,可以自行跳转到官网

    2.2 show processlist 来定位

    小屌丝:鱼哥,如果遇到正在执行慢查询时,我们该如何操作?
    小鱼:这个问题,很常见,但是也不是没有解决的办法,就是show processlist

    2.2.1 简介

    优点
    正如上面小屌丝所说,看到正在执行的慢SQL,可能会引起数据库负载过高,这个时候,就需要使用 show processlist:

    • 先 查询当前mysql有些线程正在运行;
    • 分析哪些可以线程可以被Kill;
    • 最后kill掉线程即可。

    参数

    参数定义
    Id用户登录mysql时,系统分配的"connection_id",可以使用函数connection_id()查看
    User显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句
    Host显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户
    db显示这个进程目前连接的是哪个数据库
    Command显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect)等
    Time显示这个状态持续的时间,单位是秒
    State显示使用当前连接的sql语句的状态,很重要的列。state描述的是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过copying to tmp table、sorting result、sending data等状态才可以完成
    Info显示这个sql语句,是判断问题语句的一个重要依据

    2.2.2 使用

    了解了上面的参数,我们就来实例进行;

    命令执行

    mysql>show processlist\E`
    
    `*************************** 10. row ***************************`
    
       `Id: 3366986`
    
       `User: Carl_DJ`
    
       `Host: 10.211.255.192:89068`
    
       `db: test_db`
    
       `Command:  `
    
       `Time: 2`
    
      `State: User sleep`
    
      `Info: select sleep(10)`
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这里,就是通过Time 来判断是否为慢SQL。

    3、总结

    小屌丝:我屮艸芔茻,可以啊,鱼哥, 这讲的确实很明白。
    小鱼:我没想到,你竟然会被慢SQL难住。
    小屌丝:其实,我只是想让你多分享一点慢SQL的知识,并不是我被难住了。
    在这里插入图片描述

    关于MySQL的知识, 小鱼也有过很多的分享,例如:

    其他的小鱼就不一一例举了, 如果想看更多关于mysql的知识,可以跳转到小鱼的MySQL专栏

    最后,再唠叨一句,我是小鱼

  • 相关阅读:
    如何判断BUG是前端BUG还是后端BUG
    C++中STL常用容器的用法详解
    如何在 java开发工具MyEclipse 中连接到数据库?
    父子项目打包发布至私仓库
    并发编程13-JUC之CountDownLatch
    山东首版次软件申报的好处
    Charles下载与安装教程(超详细)
    硬件学习件Cadence day13 PCB设计中一些设置, 铜皮到钻孔的距离设置, 差分线的设置,板层信息表
    分析入门 Python 股票量化交易的原因
    UNIAPP day_01(8.30) uin-app概述
  • 原文地址:https://blog.csdn.net/wuyoudeyuer/article/details/127637241