【MySQL | 第八篇】在MySQL中,如何定位慢查询以及对应解决方法?

news/2024/9/23 7:26:46/

在这里插入图片描述

文章目录

  • 8.在MySQL中,如何定位慢查询以及对应解决方法?
    • 8.1MySQL慢查询日志
      • 8.1.1开启慢查询
        • (1)修改配置文件
        • (2)设置全局变量
      • 8.1.2日志记录在表上(实践)
      • 8.1.3日志记录在文件上(实践)
        • (1)mysqldumpslow
    • 8.2深度分析慢SQL
      • 8.2.1问题
      • 8.2.2步骤一:分析SQL执行计划
      • 8.2.3索引优化

8.在MySQL中,如何定位慢查询以及对应解决方法?

  • 三种方法定位慢查询
    • Skywalking工具:实时监控接口性能,一眼锁定“拖油瓶”。报表详列各接口及内部组件耗时,尤其关注SQL执行时间,迅速圈定问题SQL;
    • MySQL内置慢查询日志;

8.1MySQL慢查询日志

  • 慢查询日志是 MySQL 内置的一项功能,可以记录执行超过指定时间的 SQL 语句

  • 以下是慢查询的相关参数,大家感兴趣的可以看下:

    参数含义
    log_output日志输出位置,默认为 FILE,即保存为文件,若设置为 TABLE,则将日志记录到 mysql.show_log 表中,支持设置多种格式
    slow_query_log_file指定慢查询日志文件的路径和名字,可使用绝对路径指定,默认值是主机名-slow.log,位于配置的 datadir 目录
    long_query_time执行时间超过该值才记录到慢查询日志,单位为秒,默认为 10
    min_examined_row_limit对于查询扫描行数小于此参数的SQL,将不会记录到慢查询日志中,默认为 0
    log_queries_not_using_indexes是否将未使用索引的 SQL 记录到慢查询日志中,开启此配置后会无视 long_query_time 参数,默认为 OFF
    log_throttle_queries_not_using_indexes设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间,默认为 0
    log-slow-admin-statements记录执行缓慢的管理 SQL,如 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 和 REPAIR TABLE,默认为 OFF
    log_slow_slave_statements记录从库上执行的慢查询语句,如果 binlog 的值为 row,则失效,默认为 OFF

8.1.1开启慢查询

有两种方式可以开启慢查询

  1. 修改配置文件
  2. 设置全局变量
(1)修改配置文件
  • 修改配置文件 my.ini,在[mysqld]段落中加入如下参数:

    [mysqld]
    log_output='FILE,TABLE'
    slow_query_log='ON'
    long_query_time=0.001
    
  • 然后需要重启 MySQL 才可以生效,命令为 service mysqld restart(永远生效)

(2)设置全局变量
  • 无需重启即可生效,但是重启会导致设置失效,设置的命令如下所示:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL log_output = 'FILE,TABLE';
SET GLOBAL long_query_time = 0.001;

8.1.2日志记录在表上(实践)

  • 通过第二种方式:设置全局变量开启慢查询;
  • 使用全表查询语句:SELECT * FROM user;
  • 然后再查询慢查询日志:SELECT * FROM mysql.slow_log,可以发现其中有这样一条记录:

image-20240429214131920

  • 这样我们就可以通过 slow_log 表的数据进行分析,然后对 SQL 进行调优了。

8.1.3日志记录在文件上(实践)

  • 若将日志记录在文件上,使用 SHOW VARIABLES LIKE '%slow_query_log_file%' 来查看文件保存位置;
  • 可以看出每五行表示一个慢 SQL,这样查看比较费事,可以使用一些工具来查看。

image-20240429215409003

(1)mysqldumpslow

MySQL 内置了 mysqldumpslow 这个工具来帮助我们分析慢查询日志文件,Windows 环境下使用该工具需要安装 Perl 环境

可以通过 -help 来查看它的命令参数:

mysqldumpslow help

img

比如我们可以通过 mysqldumpslow -s t 10 LAPTOP-8817LKVE-slow.log 命令得到按照查询时间排序的 10 条 SQL 。

img

8.2深度分析慢SQL

8.2.1问题

定位到慢SQL后,如何进行深度分析?

8.2.2步骤一:分析SQL执行计划

  • 使用explain命令分析SQL执行计划:
    • Key & Key_len确认索引是否生效。若已建索引未被充分利用,可能存在失效问题。
    • Type扫视查询类型,警惕全表扫描(All/Full Scan)等低效访问模式,寻找优化突破口。
    • rows:预计需要扫描的记录数,预计需要扫描的记录数越小越好
    • Extra留意MySQL给出的执行建议,如“Using filesort”、“Using temporary”等,提示可能存在的额外排序、临时表操作,影响性能。

8.2.3索引优化

  • 针对上述分析结果:
    • 修复失效索引:添加缺失索引,调整或重建现有索引。
    • 解决回表查询问题:若发现回表现象,尝试增加覆盖索引(一次查询,就查到了全部需要的数据,避免 SELECT *)或减少SELECT字段,减轻IO压力。

在这里插入图片描述


http://www.ppmy.cn/news/1445587.html

相关文章

资深项目经理15年心得:管理需求变更5大技巧

高效管理需求变更对项目管理至关重要。通过严格的变更控制,确保所有需求变更都与项目目标和范围保持一致,避免偏离原定计划,有助于项目按既定目标顺利推进。能够及时评估变更对项目的影响,有利于减低项目延期和超支的风险&#xf…

从0开始学习制作一个微信小程序 前端学习部分(7)数据控制操作,修改、判断等

系列文章目录 本系列会从前后端的全面角度讲述制作小程序,从零开始学小程序,跟着本系列就够了! 前端学习篇 学习篇第一篇我们讲了编译器下载,项目、环境建立、文件说明与简单操作:第一篇链接 第二、三篇分析了几个重要…

boa交叉编译(移植到arm)

参考:CentOS7 boa服务器的搭建和配置-CSDN博客 以下操作在宿主机/编译平台操作: 1. 先执行[参考]1到3、 4.2、4.3、4.4、4.5 2. 修改MakeFile # 由以下: CC gcc CPP gcc -E # 改为: CC arm-linux-gnueabihf-gcc CPP arm-l…

centos8配置的IPV4失效

centos8在/etc/sysconfig/network-scripts/ifcfg-ens160中配置的IP突然失效,使用ifconfig查看发现没有ens160的网卡。 使用ifconfig up ens160命令后查看ifconfig,发现ens160网卡但是里面没有IPV4只有IPV6 使用ifup ens160报错:No suitable…

Android常用开源库所使用的设计模式有哪些?

1. OkHttp 1)构造者模式。 构建不同的Request对象。 2)工厂模式 。 通过OkHttpClient生产出产品RealCall。 3)观察者模式。OkHttp 的某些组件可能使用观察者模式来监听和响应事件,如连接状态的变化或请求的完成。 4&#xff0…

mybaits在Oracle中使用merge into

逻辑&#xff1a;如果数据库里有&#xff0c;则进行更新操作&#xff0c;如果没有则插入数据。 这里的insert可以不用写字段 merge INTO table_name a using ( SELECT count( field01) co FROM table_name WHERE field01 123456 ) b ON ( b.co <> 0 ) WHEN MATCHED T…

QT图片图标更改后不加载问题处理

QT通过setPixmap、setIcon、setMovie等方法&#xff0c;设置图片、图标时&#xff0c;会更新图片、图标函数执行&#xff0c;但是图片图标并没有更改的情况。 尝试通过信号槽方式去设置图片&#xff0c;仍然不能响应更改&#xff0c;以下提供一个可行的解决方法。 在setPixma…

ActiveMQ 反序列化漏洞 (CVE-2015-5254)

一、漏洞描述 Apache ActiveMQ 是由美国阿帕奇&#xff08;Apache&#xff09;软件基金会开发的开源消息中间件&#xff0c;支持 Java 消息服务、集群、Spring 框架等。属于消息队列组件(消息队列组件&#xff1a;分布式系统中的重要组件&#xff0c;主要解决应用耦合、异步消息…