Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql慢查询日志

mysql慢查询日志

原创
作者头像
Qwe7
发布于 2022-03-25 00:16:30
发布于 2022-03-25 00:16:30
1.2K0
举报
文章被收录于专栏:网络收集网络收集

慢查询

代码语言:javascript
AI代码解释
复制
// 慢查询
缓慢的查询,低效的性能导致影响正常业务
MySQL默认10秒内没有响应SQL结果,为慢查询

// 检查慢查日志是否开启:
show variables like 'slow_query_log';
// 检查慢日志路径
show variables like '%slow_query_log%';
// 开启慢日志
set global slow_query_log=on;
// 慢日志判断标准(默认查询时间大于10s的sql语句)
show variables like 'long_query_time';
// 慢日志测试,检查慢日志记录情况
select sleep(12);
// 显示慢查询次数
show status like 'show_queries'
// 修改慢日志判断标准,修改为1秒 ---修改为一秒但是重启mysql之后,long_query_time依然是my.ini中的值,永久生效需要修改my.ini
set global long_query_time=1;
// 为了测试方便,所有查询都记录进慢日志(生产环境不要打开,否则产生大量无用日志,如建立索引)
set global log_queries_not_using_indexes=on;
show variables like '%log%';
// mysql数据库启动花费多少时间
show status like 'uptime'
// 显示mysql数据库的连接数
show status like 'connections'
// 显示数据的查询,更新,添加,删除次数
show status like 'com [select|insert|update|delete]'
// session是当前窗口的执行次数,global是启动至此的执行次数
show [session|global] status like
// 监听慢日志(慢日志路径注意不同)
tail -f /var/lib/mysql/izwz9hiye4lft7f85poremz-slow.log

慢查询日志的存储格式

代码语言:javascript
AI代码解释
复制
第一行,SQL查询执行的时间 
第二行,执行SQL查询的连接信息,用户和连接IP 
第三行,记录了一些我们比较有用的信息,如下解析
    (1) Query_time,这条SQL执行的时间,越长则越慢
    (2) Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
    (3) Rows_sent,查询返回的行数
    (4) Rows_examined,查询检查的行数,越长就当然越费时间
第四行,设置时间戳,没有实际意义,只是和第一行对应执行时间
第五行及后面所有行(第二个#Time:之前),执行的sql语句记录信息,因为sql可能会很长
mysqlDumpSlow

代码语言:javascript
AI代码解释
复制
// mysqldumpslow
// 简介
如果开启了慢查询日志,就会生产大量的数据,然后我们就可以通过对日志的分析,生产分析报表,通过报表进行优化
// 用法帮助
执行mysqldumpslow --help 查看详细用法
注意 在mysql数据库所在的服务器上 而不是mysql>命令行中
// 常用命令
(1) 统计:mysqldumpslow --verbose /var/lib/mysql/izwz9hiye4lft7f85poremz-slow.log
(2) 时间排序: mysqldumpslow -s c /var/lib/mysql/izwz9hiye4lft7f85poremz-slow.log
// 优缺点
这个工具是最常用的工具,通过安装mysql进行附带安装,但是该工具统计的结果比较少,对我们的优化所提供的信息还是比较少,比如cpu,io等信息都没有
pt-query-digest

代码语言:javascript
AI代码解释
复制
// 简介
pt-query-digest是用于分析mysql慢查询的一个第三方工具,它可以分析binlog、Generallog、slowlog
也可以通过SHOWPROCESSLIST或者过tcpdump抓取的mysql协议数据来进行分析。
可以把分析结果输出到文件中,分析过程中先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,可以借助分析结果找出问题进行优化
// 功能
// (1) pt-query-digest本质是perl脚本,所以首先安装perl模块
yum install -y perl-CPAN perl-Time-HiRes
// (2) 快速安装
wget https://www.percona.com/downloads/percona-toolkit/3.2.0/binary/redhat/7/x86_64/percona-toolkit-3.2.0-1.el7.x86_64.rpm
yum localinstall -y percona-toolkit-3.2.0-1.el7.x86_64.rpm
// (3) 检查是否安装完成
pt-query-digest --help

// 常用命令
(1) 查看服务器信息
pt-summary
(2) 查看磁盘开销使用信息
pt-diskstats

// mysql相关命令
// 查看mysql数据库信息
pt-mysql-summary --user=root --password=1234
// 分析慢查询日志
pt-query-digest --limit 100% /var/lib/mysql/izwz9hiye4lft7f85poremz-slow.log
// 从库和同步状态
pt-slave-find --host=localhost --user=root --password=1234
// 如果报错DBI connect(';host=localhost;mysql_read_default_group=client','root',...) failed: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory at /usr/bin/pt-slave-find line 2023.
(1) use mysql;
(2) select user,host ,plugin from mysql.user where user='root'; // perconaToolkit3.2.1不支持caching_sha2_password
(3) alter user root@'localhost' identified  with mysql_native_password by 'mysqlpassword'; // 让mysql支持percona的身份验证插件
// 查看mysql的死锁信息,在test库中建立一张deadlocks表,用于记录死锁信息
pt-deadlock-logger --run-time=10 --interval=3 --create-dest-table --dest D=test,t=deadlocks u=root,p=mysqlpassword
// 从慢查询日志中分析索引使用情况
pt-index-usage --user=root --password=mysqlpassword --host=localhost /var/lib/mysql/izwz9hiye4lft7f85poremz-slow.log
// 从慢查找数据库表中重复的索引
pt-duplicate-key-checker --host=localhost --user=root --password=mysqlpassword
// 查看mysql表和文件的当前活动IO开销(不要在高峰时使用)
pt-ioprofile
// 查看不同mysql配置文件的差异(集群常用,双方都生效的变量)
pt-config-diff /etc/my.cnf /root/my_master.cnf
// 查找数据库里大于1M的表
pt-find --user=root --password=mysqlpassword --tablesize +1M
// 查找表和索引大小并排序
pt-find --user=root --password=mysqlpassword --printf "%T\t%D.%N\n" | sort -rn
// 杀掉显示查询时间大于3秒的查询,--print仅为打印,--kill为杀死
pt-kill --user=root --password=mysqlpassword --busy-time 3 --print(打印) --kill(杀死)
// 查看mysql授权(集群常用,授权复制) 示例如下
pt-show-grants --user=root --password=mysqlpassword
pt-show-grants --user=root --password=mysqlpassword --separate --revoke
// 验证数据库复制的完整性(集群常用,主从复制后校验),示例如下
pt-table-checksum --user=root --password=mysqlpassword

// pt-query-digest排除有问题的SQL
// (1) 查询次数多且每次查询占用时间长的sql
通常为pt-query-digest分析的前几个查询,该工具可以很清楚的看出每个SQL执行的次数及百分比等信息,执行的次数多,占比较大的SQL
// (2) IO大的sql
注意pt-query-digest分析中的Rows examine项,扫描的行数越多,IO越大
// (3) 未命中的索引sql
pt-query-digest分析中的Rows examine(检测的数据)和Rows Send(真正发给客户端的数据)的对比。如果相差较大,说明该SQL的索引命中率不高,对于这种SQL,我们要重点进行关注

执行计划

代码语言:javascript
AI代码解释
复制
// 执行计划
SQL的执行计划反映出SQL的执行效率,在执行的SQL前面加上explain即可,如 explain select * from actor;
官方文档 https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

// id
数字越大越先执行,如果数字一样大,那么就从上往下执行,id列为null就表示这是一个结果集,不需要使用它来查询
// select_type
simple: 表示不需要union操作或者不包含子查询的简单select查询,有连接查询时,外层的查询为simple,其只有一个
primary: 一个需要union操作或者含有子查询的select,位于最外层的查询,select_type即为primary,且只有一个
union: union连接的两个select查询,第一个查询时dervied派生表,除第一个表外,第二个以后的表select_type都是union
union result: 包含union的结果集,在union和union all语句中,因此它不需要参与查询,所有id字段为null
dependent union: 与union一样,出现在union或union all语句中,但是这个查询要受到外部查询的影响,比如where in
subquery: 除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
dependent subquery: 与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
derived: from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select
materialization: 物化子查询通过将子查询结果作为一个临时表来加快查询执行速度,正常来说是常驻内存,下次查询会再次引用临时表

// table
显示的查询表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这里显示为null,如果显示为尖括号括起来的<derived N>就表示这个是临时表
后边的N就是执行计划中的id,表示结果来自于这个查询产生.如果是尖括号括起来的<union M,N>,<derived N>类似,也是一个临时表,表示这个结果来自于union查询的id为M,N结果集
// type,好的索引至少达到range,最好达到ref
system: 表中只有一行数据或者空表,且只能用于myisam和memory表,如果是innodb引擎表,type列在这个情况通常都是all或者index
const: 使用*唯一索引或者主键*,返回记录一定是*一行记录的等值*where条件时,通常type是const,其他数据库也叫做唯一索引扫描
eq_ref: 出现在要连接多个表的查询计划中,驱动表循环获取数据,这行数据是第二个表的主键或者唯一索引,作为条件查询只返回*一条数据*,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
ref: 不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据*不唯一的等值*查找就可能出现
fulltext: 全文索引检索,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引 ft_idx_t1_nickname_remark
ref_or_null: 与ref方法类似,只是增加了null值的比较,实际用的不多
unique_subquery: 用于where中的in形式子查询,子查询返回不重复唯一值
index_subquery: 用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可能使用索引将子查询去重
range: 索引范围扫描,常见于使用>,<,is null,between,in,like等运算符的查询中
index_merge: 表示查询使用了两个以上的索引,最后取交集或者并集,常见于and,or的条件使用了不同的索引,
            官方排序这个在ref_or_null之后,但是实际上由于要读取多个索引,性能可能大部分时间都不如range
index: 索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询,换句话说,所有的数据就在索引里,不需要回表
all: 这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录

// possible_keys
查询可能使用到的索引

// key
查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个

// key_len
用于处理查询的索引长度,如果是单列索引,那就是整个索引长度,如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用的列不会计算进去。留一下这个值,算一下你的多列索引总长度就知道有没有使用到所有的列了。另外,key_len只计算where条件用到的长度,而排序和分组就算用到了索引,也不会计算到key_len中

// ref
如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件,使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func

// rows
这里是执行计划中估算的扫描行数,不是精确值

// extra
no tables used: 不带from字句的查询或者from dual查询
NULL: 查询的列未被索引覆盖,并且where筛选条件是索引的前导列(where条件字段复合索引连续连起来的索引),意味着用到了索引,但是部分字段未被索引覆盖,必须通过"回表"来实现,不是纯粹的用到了索引,也不是完全没用到索引
using index: 查询时不需要回表查询,直接通过索引就可以获取到查询的数据
using where: 查询的列未被索引覆盖,where筛选条件*非索引*的前导列
using where using index: 查询的列被索引覆盖,并且where筛选条件是索引列之一但是*不是索引的前导列*,意味着无法直接通过索引查找来查询到符合条件的数据
using index condition: 与using where类似,查询的列不完全被索引覆盖,where条件中是一个前导列的范围
using temporary: 表示使用了*临时表存储中间结果*比如select distinct。临时表可以是内存临时表和磁盘临时表,执行计划中看不出来,需要查看status变量,used_tmp_table,used_tmp_disk_table才能看出来
using filesort: mysql会对结果使用一个外部索引排序(外部临时文件),而不是按索引次序从表里读取行,此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。
using intersect: 表示使用and的各个索引的条件时,该信息表示从处理结果获取交集
using union: 表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集
using sort_union和using sort_intersection: 用and和or查询信息量大时,先查询主键,然后进行排序合并后返回结果集
firstmatch(tb_name): 5.6.x开始引入的优化子查询的新特性之一,常见于where字句含有in()类型的子查询,如果内表的数据量比较大的,就可能出现这个
loosescan(m..n): 5.6.x之后引入的优化子查询的新特性之一,in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个

// filtered
filtered: 使用explain extended时会出现这个列,5.7之后的版本默认就有这个字段,不需要使用explain extended了。这个字段表示存储引擎返回的数据在server层过滤后,剩下多少

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mysql慢查询日志的使用 和 Mysql的优化
1、临时开启慢查询日志(如果需要长时间开启,则需要更改mysql配置文件,第6点有介绍)
lyb-geek
2018/11/08
1.3K0
MySQL日志之慢查询日志Slow Log
慢查询日志是MySQL提供的用于记录执行时间超过指定阈值的SQL语句的日志功能,是数据库性能优化的核心工具之一。 大白话就是,查询语句超过一定时间没有结果返回,就会将查询语句记录到日志中。
晚上不吃饭了
2025/05/12
7140
MySQL日志之慢查询日志Slow Log
MySQL中,如何分析你的 SQL 慢在哪里
MySQL 是我们日常开发中最常用的关系型数据库之一,当随着数据库中的数据量增多,同样的SQL查询性能却开始下降,造成页面卡顿,数据加载缓慢。那么,如何分析出哪条SQL性能下降,就成了开发人员的必备技能。
叫我阿柒啊
2025/04/23
1K0
MySQL中,如何分析你的 SQL 慢在哪里
深入探索SQL优化:利用慢查询日志和explain提升数据库效率
开始之前推荐一篇实用的文章:《MySQL存储引擎大厂面试经典三连问》,作者:【小白的大数据之旅】。
Lion 莱恩呀
2024/11/29
3960
深入探索SQL优化:利用慢查询日志和explain提升数据库效率
MySQL慢查询攻略
总结:MySQL慢查询优化需结合索引策略、SQL重构、参数调优三位一体。通过EXPLAIN分析执行计划,使用pt-query-digest定位问题查询,建立监控体系预防性能退化,方能实现数据库高效稳定运行。
程序猿川子
2025/06/11
2690
MySQL慢查询攻略
MySQL-如何定位慢查询SQL以及优化
定位慢SQL可以通过慢查询日志来查看慢SQL,默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把它打开 SET GLOBAL slow_query_log = ‘ON’;
才疏学浅的木子
2023/10/17
1.9K0
MySQL-如何定位慢查询SQL以及优化
快速学会分析SQL执行效率(上)
从开篇词我们了解到,本专栏首先会一起讨论一下 SQL 优化,而优化 SQL 的前提是能定位到慢 SQL 并对其进行分析,因此在专栏的开始,会跟大家分享如何定位慢查询和如何分析 SQl 执行效率。在前面两节,会用一些简单的例子让大家学会这些分析技巧。
友儿
2022/09/11
9710
MySQL慢查询功能详解
有人的地方就有江湖,数据库也是,sql优化这个问题,任重道远,我们总是禁不住有烂sql。怎么办呢,还好各大数据库都有相关烂sql的收集功能,而MySQL的慢查询收集也是异曲同工,配合分析sql的执行计划,这个优化就有了搞头了。
星哥玩云
2022/08/16
1.2K0
SQL语句的优化
slow_query_log_file 指定慢查询日志的存储路径及文件(默认情况下保存在MySQL的数据目录中)
马士兵的朋友圈
2020/09/08
3.6K0
SQL语句的优化
MySQL慢查询日志分析详解[通俗易懂]
分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。
全栈程序员站长
2022/11/08
1.8K0
mysql之存储引擎 体系结构 查询机制(二)
1,插拔式的插件方式 ,插拔式的插件方式 2,存储引擎是指定在表之上的,即一个库中的每一个表都可 ,存储引擎是指定在表之上的,即一个库中的每一个表都可以指定专用的存储引擎。 3,不管表采用什么样的存储引擎,都会在数据区,产生对应 ,不管表采用什么样的存储引擎,都会在数据区,产生对应的一个 的一个frm文件(表结构定义描述文件)
周杰伦本人
2022/10/25
9990
mysql之存储引擎 体系结构 查询机制(二)
【建议收藏】MySQL 三万字精华总结 —锁机制和性能调优(四)
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。
码农编程进阶笔记
2021/07/20
1.2K0
【建议收藏】MySQL 三万字精华总结 —锁机制和性能调优(四)
1 SQL查询优化1. 获取有性能问题SQL的方法2.慢查询日志介绍3. 实时获取3.SQL的解析预处理及生成执行计划4 对特定SQL的查询优化
SQL语句优化 对查询进行优化,要尽量避免全表扫描。在 where 或 order by 的列上加索引。 尽量避免在 where 子语句中有 where num is null,这样不用索引,要全表扫描,可用 0 代替 null 避免在 where 中用<>or!=,因为要全表扫描 尽量避免在 where 中用 or,因为若一个字段有索引,一个没有,则要全表扫描 like”%abc%”,全表扫描 避免在 where 子语句中对字段进行函数操作,因为要全表扫描 使用复合索引时,必须用到该索引的第一个字段,否则
JavaEdge
2018/05/16
2.8K0
MySQL数据优化总结-查询备忘录
一、优化分类 二、测试数据样例 参考mysql官方的sakina数据库。 三、使用mysql慢查询日志对有效率问题的sql进行监控 第一个,开启慢查询日志。第二个,慢查询日志存储位置。第三个,没有使用
程序你好
2018/07/20
6620
MySQL-获取有性能问题SQL的方法_慢查询 & 实时获取
http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html
小小工匠
2021/08/17
9310
MySQL 查询分析
本文主要讲述了如何定位 MySQL 的性能瓶颈,使用慢查询日志、explain 命令、MySQLdumpslow 工具等方法。首先介绍了慢查询日志的格式,以及通过慢查询日志定位性能问题的方法。其次,讲解了 explain 命令的使用方式,包括查看索引情况、查看查询计划等。最后,介绍了如何使用 MySQLdumpslow 工具来分析慢查询日志,并给出了一些优化建议。
谢庆玲
2017/06/01
4.7K2
MySQL慢查询分析和性能优化的方法和技巧
MySQL是一款常用的关系型数据库,广泛应用于各种类型的应用程序和数据存储需求。然而,随着数据量的增加和业务的复杂性,MySQL数据库的性能问题变得越来越普遍。在这种情况下,慢查询分析和性能优化成为了MySQL数据库管理员必须掌握的重要技能。本文将详细介绍MySQL慢查询分析和性能优化的方法和技巧。
网络技术联盟站
2023/06/08
2.3K0
MySQL慢查询分析和性能优化的方法和技巧
一款超级强大的慢SQL排查工具!
在项目中我们会经常遇到慢查询,当我们遇到慢查询的时候一般都要开启慢查询日志,并且分析慢查询日志,找到慢sql,然后用explain来分析
Java识堂
2021/03/30
3.6K0
一款超级强大的慢SQL排查工具!
MySql性能测试
相信很多做性能测试的朋友都知道,性能测试并不单单只是看服务器cpu、IO、内存、网络等,我们还需要了解Mysql性能,那么我们看看Mysql性能主要内容有哪些呢?
全栈程序员站长
2021/05/27
2.3K0
【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
“你一定又写了烂SQL了!”,“你怎么这样凭空污人清白……慢查询,慢查询不能算烂……慢查询!……程序猿的事,能算烂么?” 本文从SQL执行效率方面略作研究,偏向基础性总结,但力求详实准确。如果有大佬误入此地,还请从容撤退,如果你真的愿意看,我也没什么意见。
云深i不知处
2020/09/16
1.6K0
推荐阅读
相关推荐
Mysql慢查询日志的使用 和 Mysql的优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档