【MySQL从入门到精通】【高级篇】(二十二)慢查询日志分析,SHOW PROFILE查看SQL执行成本

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 上一篇文章我们介绍数据库的优化步骤【MySQL从入门到精通】【高级篇】(二十一)数据库优化步骤_查看系统性能参数,其中,说到了通过开启慢查询日志来分析慢查询的SQL。这篇文章就是具体来介绍如何开启慢查询日志以及如何分析慢查询日志。

1. 简介

上一篇文章我们介绍数据库的优化步骤【MySQL从入门到精通】【高级篇】(二十一)数据库优化步骤_查看系统性能参数,其中,说到了通过开启慢查询日志来分析慢查询的SQL。这篇文章就是具体来介绍如何开启慢查询日志以及如何分析慢查询日志。

2. 定位执行慢的SQL:慢查询日志

MySQL中的慢查询日志,用来记录在MySQL中响应时间超过阈值的语句,具体就是运行时间超过long_query_time值的SQL。则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上(不含10秒)的语句。


它的主要作用就是帮助我们发现那些执行时间特别长的SQL查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发送阻塞,运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助,比如一条SQL语句执行超过2秒,我们就算慢sql,希望能够收集超过2秒的sql,结合explain进行全面分析。


默认情况下,MySQL数据库没有开启慢查询分析,需要我们手动设置这个参数,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志或多或少带来一定的性能影响。

2.1. 开启慢查询日志参数

开启slow_query_log
在使用前,我们需要先看下慢查询是否已经开启,使用下面这条命令即可:

mysql> show variables like '%slow_query_log';

我们能看到 slow_query_log=OFF,我们可以把慢查询日志打开,注意设置变量值的时候需要使用global,否则会报错;

mysql> set global slow_query_log=on;

然后我们再来查看下慢查询日志是否开启,以及慢查询日志文件的位置;

mysql> show variables like '%slow_query_log%';

修改long_query_time阈值
默认情况下long_query_time的阈值是10秒,可以使用如下命令进行查看:

mysql> show variables like 'long_query_time';

可以通过set命令进行修改,如下就是将long_query_time的阈值改成0.1秒,加global对全局生效,不加global则对当前会话生效。

#全局的long_query_time阈值设置为0.2
mysql> set global long_query_time=0.2;
#当前会话的long_query_time阈值设置为0.1
mysql> set long_query_time=0.1;

如下的方式相较于前面命令行方式,可以看作是永久设置的方式。

修改my.cnf 文件,在**[mysqld]下增加或者修改参数long_query_time**, slow_query_timeslow_query_log_file后,然后重启Mysql服务器。

[mysqld]
slow_query_log=ON  #开启慢查询日志的开关
slow_query_log_file=/var/lib/mysql/devdb-slow.log #慢查询日志的目录和文件名
long_query_time=0.1 #设置慢查询的阈值为0.1秒,超出此设置值的SQL即被记录到慢查询日志
log_output=FILE

如果不指定存储路径,慢查询日志将默认存储到MySQL数据库的数据文件夹下。如果不指定文件名,默认文件名为hostname-slow.log。

2.2. 查看慢查询

查询当前系统中有多少条慢查询记录

mysql > show global status like '%slow_queries';

3. 造数据进行测试

这里选用的数据还是 【MySQL从入门到精通】【高级篇】(二十)适合创建索引的11种情况&不适合创建索引的7种情况,万字长文 文章中提到的 feigedb库中的student表。student表中有100万条数据,这里执行

SELECT COUNT(*) FROM student WHERE student_id!=177875;

语句用于统计student_id不等于177875的记录数。此查询语句执行时间在0.18s。

接着在分析下有多少慢查询语句

mysql> show status like 'slow_queries';


除了上述变量,控制慢查询日志的还有一个系统变量:min_examined_row_limit。这个变量的意思是:查询扫描过的最少记录数。 这个变量和查询执行时间,共同组成了判别一个查询是否是慢查询的条件,如果查询扫描过的记录数大于等于这个变量的值,并且查询执行时间超过long_query_time的值,那么这个查询就会被记录到慢查询日志中,反之,则不会被记录到慢查询日志中。


4. 慢查询日志分析工具:mysqldumpslow

在生产环境中,如果要手工分析日志,查找,分析SQL,显然是个体力活,MySQL提供了日志分析mysqldumpslow。

查看mysqldumpslow的帮助信息

mysqldumpslow --help

这里我的服务器 mysqldumpslow.sh 不兼容Percona 扩展的慢查询日志,需要使用 pt-query-digest 命令来替换。

[root@devdb ~]# mysqldumpslow --help
"mysqldumpslow.sh" is not currently compatible with Percona extended slow query
log format. Please use "pt-query-digest" from Percona Toolkit instead
(https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html).

pt-query-digest

安装默认情况下直接使用pt-query-digest 命令会提示找不到该命令

本人系统的环境是Red Hat 环境

自动安装percona-toolkit

sudo yum install percona-toolkit

手动安装

如果该命令安装不行的话,则需要手动安装,首先就是下载percona-toolkit_3.0.3-1.jessie_amd64.deb 的安装包。

wget https://www.percona.com/downloads/percona-toolkit/3.0.3/binary/debian/jessie/x86_64/percona-toolkit_3.0.3-1.jessie_amd64.deb

下载好之后接着就是进行安装了。

yum localinstall -y percona-toolkit-3.2.1-1.el7.x86_64.rpm

安装好之后,输入 pt-query-digest --help 就能正常使用了。

pt-query-digest的使用

mysql系列(六)mysql 慢日志查询(pt-query-digest)/如何单条SQL分析和Explain及trace工具

percona-toolkit 之 【pt-query-digest】介绍

pt-query-digest /var/lib/mysql/devdb-slow.log

5. 关闭慢查询日志

MySQL服务器停止慢查询日志功能有两种

方式1:永久性方式

修改my.cnf或者my.ini文件,把[mysqld] 组下的slow_query_log值设置为OFF,修改保存,在重启MySQL服务器,即可生效

[mysqld]
slow_query_log=OFF

或者,把slow_query_log一项注释掉,或者删掉

[mysqld]
#slow_query_log=OFF

重启MySQL服务

service mysqld restart

执行如下语句查询慢日志功能

SHOW VARABLES LIKE '%slow%'; #查询慢查询日志所在目录
SHOW VARABLES LIKE '%long_query_time%'; #查询超时时长

可以看到,MySQL系统中的慢查询日志是关闭的。

方式2:临时性方式

停止MySQL慢查询日志功能,具体SQL语句如下:

SET GLOBAL slow_query_log=OFF

总结

本文详细介绍了如同进行慢查询日志分析


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
存储 分布式计算 大数据
【Flume的大数据之旅】探索Flume如何成为大数据分析的得力助手,从日志收集到实时处理一网打尽!
【8月更文挑战第24天】Apache Flume是一款高效可靠的数据收集系统,专为Hadoop环境设计。它能在数据产生端与分析/存储端间搭建桥梁,适用于日志收集、数据集成、实时处理及数据备份等多种场景。通过监控不同来源的日志文件并将数据标准化后传输至Hadoop等平台,Flume支持了性能监控、数据分析等多种需求。此外,它还能与Apache Storm或Flink等实时处理框架集成,实现数据的即时分析。下面展示了一个简单的Flume配置示例,说明如何将日志数据导入HDFS进行存储。总之,Flume凭借其灵活性和强大的集成能力,在大数据处理流程中占据了重要地位。
32 3
|
11天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
26 0
|
14天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
47 0
|
14天前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
34 0
|
14天前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
33 0
|
15天前
|
SQL 数据管理 关系型数据库
SQL与云计算:利用云数据库服务实现高效数据管理——探索云端SQL应用、性能优化、安全性与成本效益,为企业数字化转型提供全方位支持
【8月更文挑战第31天】在数字化转型中,企业对高效数据管理的需求日益增长。传统本地数据库存在局限,而云数据库服务凭借自动扩展、高可用性和按需付费等优势,成为现代数据管理的新选择。本文探讨如何利用SQL和云数据库服务(如Amazon RDS、Google Cloud SQL和Azure SQL Database)实现高效的数据管理。通过示例和最佳实践,展示SQL在云端的应用、性能优化、安全性及成本效益,助力企业提升竞争力。
36 0
|
15天前
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
20 0
|
16天前
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息
|
18天前
|
算法 关系型数据库 程序员
第一周算法设计与分析:A : log2(N)
这篇文章介绍了解决算法问题"输入一个数N,输出log2N(向下取整)"的三种编程思路,包括使用对数函数和幂函数的转换方法,以及避免浮点数精度问题的整数逼近方法。
|
21天前
|
SQL JavaScript 前端开发
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题
【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题