mysql慢查询:pt-query-digest 分析
"某些SQL语句执行效率慢",这个问题总体上分为两类:
- 出现了慢查询语句
- 某些查询语句没有使用索引
由于数据的写入量非常大,所以要想直接打开慢查询日志来查看到底哪些语句有问题几乎是不可能的,因为日志的刷新速度太快了,于是想起了pt工具,pt工具中的pt-query-digest比较擅长解决这个问题。
子曰:“工欲善其事,必先利其器”
善于利用好的性能分析工具可以使运维效率事半功倍。
pt-query-digest 属于 Percona Toolkit 工具集中较为常用的工具,用于分析 slow log,可以分析 MySQL 数据库的 binary log 、 general log 日志,同时也可以使用 show processlist 或从 tcpdump 抓取的 MySQL 协议数据来进行分析。
# wget https://www.percona.com/downloads/percona-toolkit/3.2.1/binary/redhat/7/x86_64/percona-toolkit-3.2.1-1.el7.x86_64.rpm
# yum -y localinstall percona-toolkit-3.2.1-1.el7.x86_64.rpm
根据时间点,这里我们用alert_time来表示,那么导致报警的SQL很有可能在这个时间点附近。
这里用到Linux中的sed命令来把日志先截取出来,sed命令的使用方法如下:
sed -n '/2019-02-27T01:55:04/,/2019-02-27T02:02:04/p' /path/to/mysql-slow.log > mysql-slow.log.tmp
这个命令将格林尼治时间01:55:04到02:05:04的慢日志打印出来,重定向到一个mysql-slow.log.tmp的文件中,需要注意的是格林尼治时间加上8小时就是北京时间。
发现这个mysql-slow.log.tmp也比较大,所以我又重新把时间定格在60s之内,这样得到了一个比较小的tmp文件,这个时候,就该pt工具上场了。
如果不想用sed命令,其实pt工具本身也自带一些参数,可以通过--since参数和 --until参数来把日志中固定时间段的日志打印出来:
pt-query-digest --since='2019-02-27 09:30:00' --until=2019-02-27 09:31:00' /path/to/mysql-slow.log > mysql-slow.log.tmp
用pt工具分析慢日志的结果如下,总体分为三个部分。
第一部分是总体统计结果,如下:
该工具执行日志分析的用户时间,系统时间,物理内存占用大小,虚拟内存占用大小
# 480ms user time, 10ms system time, 26.18M rss, 206.09M vsz
工具执行时间
# Current date: Wed Feb 27 10:51:36 2019
主机名
# Hostname:
被分析的文件名
# Files: yyz.tmp
语句总数量,唯一的语句数量,QPS,并发数
# Overall: 1.00k total, 32 unique, 8.45 QPS, 0.02x concurrency ___________
日志记录的时间范围
# Time range: 2019-02-27T02:34:04 to 2019-02-27T02:36:03
属性 总计 最小 最大 平均 95% 标准 中等
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
语句执行时间
# Exec time 2s 97us 515ms 2ms 5ms 21ms 799us
锁占用时间
# Lock time 85ms 32us 448us 84us 131us 32us 80us
发送到客户端的行数
# Rows sent 237.45k 0 2.36k 241.93 1.96k 551.62 0
select语句扫描的行数
# Rows examine 3.53M 0 536.64k 3.60k 4.07k 33.64k 685.39
发送改变的行数(update,delete,insert)语句
# Rows affecte 0 0 0 0 0 0 0
发送多少bytes的查询结果集
# Bytes sent 65.63M 0 1.31M 66.87k 753.18k 221.17k 346.17
查询语句的字符数
# Query size 107.70k 56 303 109.74 223.14 48.96 92.72
第二部分是查询分组的统计结果,包含了一些花费时间比较长的SQL语句,如下:
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ============= ===== ====== ===== ===============
# 1 0xCB9AD73BDFEDCAD9 0.9584 42.9% 2 0.4792 0.01 UPDATE SELECT dic_push_dao_assistant tem_selectAssDAO
# 2 0x2AEA2001E6ED5A86 0.3696 16.5% 288 0.0013 0.00 SELECT dic_alert_alarm_msg
# 3 0xE2874B8D2170C494 0.2174 9.7% 18 0.0121 0.00 SELECT dic_fsm_cccd_info
# 4 0xEB9DC21456584EF6 0.0919 4.1% 18 0.0051 0.00 SELECT dic_fsm_info
# 5 0xF3A68A619C5E8B35 0.0906 4.1% 18 0.0050 0.00 SELECT dic_fsm_info
# 6 0x5C1B79C191BDA497 0.0725 3.2% 118 0.0006 0.00 SELECT original_dic_fsm_info
# 7 0x5DB1B21F7EEC9EF4 0.0597 2.7% 18 0.0033 0.00 SELECT dic_fsm_config_info
# 8 0xA88FE251DC1A981A 0.0584 2.6% 18 0.0032 0.00 SELECT dic_fsm_config_info
# 9 0x69E716E15CCC4A0F 0.0539 2.4% 118 0.0005 0.00 SELECT original_dic_fsm_config_info
# 10 0x0A6FC9E2C8542E17 0.0476 2.1% 18 0.0026 0.00 SELECT dic_cal_expression
# 11 0x7C0C6F0CFBADF271 0.0427 1.9% 19 0.0022 0.00 SELECT dic_cal_expression
# 12 0x872EBAFA1A73057B 0.0311 1.4% 19 0.0016 0.00 SELECT dic_guide_list_info
# 13 0xE73D713D87E945FC 0.0232 1.0% 102 0.0002 0.00 SELECT dic_alert_refresh
# 14 0x194B14BA91941B81 0.0204 0.9% 18 0.0011 0.00 SELECT dic_fsm_map_relation
# MISC 0xMISC 0.0960 4.3% 213 0.0005 0.0 <18 ITEMS>
Rank:所有语句的排名,默认按查询时间降序排列Query ID:语句的IDResponse:总的响应时间time:该查询在本次分析中总的时间占比calls:执行次数,即本次分析总共有多少条这种类型的查询语句R/Call:平均每次执行的响应时间V/M:响应时间Variance-to-mean的比率
可以看到,有一些语句一秒钟之内call了大概288次,并发量算是比较高了。
还有第一行的update语句大概占用了将近一半的运行时间,但是我们可以看到,这个响应时间是很短的,几乎都在1s之内,按道理不会出现在慢查询日志上面。
之所以这些执行时间在1s之内的SQL语句会出现在慢查询日志上面,是因为MySQL中开启了一个参数,如下:
1 mysql> show variables like '%index%';2+----------------------------------------+--------------------------------------------+3| Variable_name | Value |4+----------------------------------------+--------------------------------------------+5| eq_range_index_dive_limit | 200 |6| expand_fast_index_creation | OFF |7| innodb_adaptive_hash_index | ON |8| innodb_adaptive_hash_index_parts | 8 |9| innodb_cmp_per_index_enabled | OFF |
10| log_bin_index | /path/to/mysqlbin.index |
11| log_queries_not_using_indexes | ON |
12| log_throttle_queries_not_using_indexes | 0 |
13| performance_schema_max_index_stat | -1 |
14| relay_log_index | /path/to/slave-relay-bin.index |
15+----------------------------------------+--------------------------------------------+
1610 rows in set (0.00 sec)
也就是第11行的log_queries_not_using_indexes参数,这个参数开启的话,MySQL会默认将没有使用index的SQL语句也记录在慢日志中,如果数据量比较小的话,这些SQL语句看着没什么大的问题,一旦表中的数据变的很大的时候,这些SQL极有可能出现性能问题。
第三部分是第二部分查出来的每一个SQL语句的详细统计结果。如下:
1# Query 1: 0.03 QPS, 0.02x concurrency, ID 0xCB9AD73BDFEDCAD9 at byte 604302# This item is included in the report because it matches --limit.3# Scores: V/M = 0.014# Time range: 2019-02-27T02:34:32 to 2019-02-27T02:35:325# Attribute pct total min max avg 95% stddev median6# ============ === ======= ======= ======= ======= ======= ======= =======7# Count 0 28# Exec time 42 958ms 443ms 515ms 479ms 515ms 51ms 479ms9# Lock time 0 254us 116us 138us 127us 138us 15us 127us
10# Rows sent 0 0 0 0 0 0 0 0
11# Rows examine 29 1.05M 536.64k 536.64k 536.64k 536.64k 0 536.64k
12# Rows affecte 0 0 0 0 0 0 0 0
13# Bytes sent 0 0 0 0 0 0 0 0
14# Query size 0 252 126 126 126 126 0 126
15# String:
16# Databases tgp_db
17# Hosts 127.0.0.1
18# Last errno 0
19# Stored routi tgp_db.PCall_TGP_GetAssDAO
20# Users dba_admin
21# Query_time distribution
22# 1us
23# 10us
24# 100us
25# 1ms
26# 10ms
27# 100ms ################################################################
28# 1s
29# 10s+
30# Tables
31# SHOW TABLE STATUS FROM `tgp_db` LIKE 'dic_push_dao_assistant'\G
32# SHOW CREATE TABLE `tgp_db`.`dic_push_dao_assistant`\G
33# SHOW TABLE STATUS FROM `tgp_db` LIKE 'tem_selectAssDAO'\G
34# SHOW CREATE TABLE `tgp_db`.`tem_selectAssDAO`\G
35update `dic_push_dao_assistant`
36 set `state` = 1
37 where `id` in
38 (
39select `id`
40 from `tem_selectAssDAO`
41 )\G
42# Converted for EXPLAIN
43# EXPLAIN /*!50100 PARTITIONS*/
44select `state` = 1 from `dic_push_dao_assistant` where `id` in
45 (
46select `id`
47 from `tem_selectAssDAO`
48 )\G
这里给出的每一个语句执行的时候的一些信息,最上面的表格列出了执行次数、最大、最小、平均、95%等各项目的统计。
ID:查询的ID号,和上图的Query ID对应Databases:数据库名Users:各个用户执行的次数(占比)Query_time distribution :查询时间分布, 长短体现区间占比,本例中1s-10s之间查询数量是10s以上的两倍。Tables:查询中涉及到的表
通过上面的SQL语句分析,可以看出查询的时候是把update操作转化成了select操作,然后这个select操作里面扫描了tem_selectAssDAO全表,所以导致SQL的执行时间比较长,如果表中的数据量很大的话,这无疑是一个慢SQL。
pt-query-digest常用方法:
1.直接分析慢查询文件:
pt-query-digest slow.log > slow_report.log2.分析最近12小时内的查询:
pt-query-digest --since=12h slow.log > slow_report2.log3.分析指定时间范围内的查询:
pt-query-digest slow.log --since '2017-01-07 09:30:00' --until '2017-01-07 10:00:00' > slow_report3.log4.分析指含有select语句的慢查询
pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log > slow_report4.log5针对某个用户的慢查询
pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log > slow_report5.log6.查询所有全表扫描或full join的慢查询
pt-query-digest --filter '(($event->{Full_scan} || "") eq "yes") ||(($event->{Full_join} || "") eq "yes")' slow.log > slow_report6.log7.把查询保存到query_review表pt-query-digest --user=root -password=abc123 --review h=localhost,D=test,t=query_review --create-review-table slow.log8.分析binlog
mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql
pt-query-digest --type=binlog mysql-bin000093.sql > slow_report10.log9.分析general log
pt-query-digest --type=genlog localhost.log > slow_report11.log
参考
MySQL 5.7 Reference Manual / The Slow Query Log
https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
pt-query-digest - Analyze MySQL queries from logs, processlist, and tcpdump
https://docs.percona.com/percona-toolkit/pt-query-digest.html
MySQL日常运维之percona-toolkit工具pt-query-digest
https://www.modb.pro/db/42424
pt-query-digest查询日志分析工具
http://t.zoukankan.com/hfclytze-p-pt-query-digest.html
相关文章:
mysql慢查询:pt-query-digest 分析
"某些SQL语句执行效率慢",这个问题总体上分为两类: 出现了慢查询语句某些查询语句没有使用索引 由于数据的写入量非常大,所以要想直接打开慢查询日志来查看到底哪些语句有问题几乎是不可能的,因为日志的刷新速度太快了…...
git的使用整合
git的下载和安装暂时不论述了,将git安装后会自动配置环境变量,所以环境变量也不需要配置。 一、初始化配置 打开git bash here(使用linux系统下运行的口令),弹出一个类似于cmd的窗口。 (1)配置属性 git config --glob…...
XCPC第九站———背包问题!
1.01背包问题 我们首先定义一个二维数组f,其中f[i][j]表示在前i个物品中取且总体积不超过j的取法中的最大价值。那么我们如何得到f[i][j]呢?我们运用递推的思想。由于第i个物品只有选和不选两种情况,当不选第i个物品时,f[i][j]f[i…...
【软考 系统架构设计师】论文范文④ 论基于构件的软件开发
>>回到总目录<< 文章目录 论基于构件的软件开发范文摘要正文论基于构件的软件开发 软件系统的复杂性不断增长、软件人员的频繁流动和软件行业的激烈竞争迫使软件企业提高软件质量、积累和固化知识财富,并尽可能地缩短软件产品的开发周期。 集软件复用、分布式对…...
spring-integration-redis中分布式锁RedisLockRegistry的使用
pom依赖:<!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.integ…...
城市通电(prim算法)
acwing3728 蓝桥杯集训每日一题 平面上遍布着 n 座城市,编号 1∼n。 第 i 座城市的位置坐标为 (xi,yi) 不同城市的位置有可能重合。 现在要通过建立发电站和搭建电线的方式给每座城市都通电。 一个城市如果建有发电站,或者通过电线直接或间接的与建…...
【动态规划】
动态规划1引言题目509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯小结53. 最大子数组和结语引言 蓝桥杯快开始了啊,自从报名后还没认真学过算法有(>﹏<)′,临时抱一下佛脚,一起学学算法。 题目 509. 斐波那契数 斐波那契数 &am…...
秒懂算法 | DP概述和常见DP面试题
动态(DP)是一种算法技术,它将大问题分解为更简单的子问题,对整体问题的最优解决方案取决于子问题的最优解决方案。本篇内容介绍了DP的概念和基本操作;DP的设计、方程推导、记忆化编码、递推编码、滚动数组以及常见的DP面试题。 01、DP概述 1. DP问题的特征 下面以斐波那…...
【C++提高编程】C++全栈体系(二十五)
C提高编程 第四章 STL- 函数对象 一、函数对象 1. 函数对象概念 概念: 重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载的()时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类&…...
【云原生】k8s核心技术—集群安全机制 Ingress Helm 持久化存储-20230222
文章目录一、k8s集群安全机制1. 概述2. RBAC——基于角色的访问控制二、Ingress三、Helm1. 引入2. 使用功能Helm可以解决哪些问题3. 介绍4. 3个重要概念5. helm 版本变化6. helm安装及配置仓库7. 使用helm快速部署应用8. 自己创建chart9. 实现yaml高效复用四、持久化存储1.nfs—…...
【Linux】实现简易的Shell命令行解释器
大家好我是沐曦希💕 文章目录一、前言二、准备工作1.输出提示符2.输入和获取命令3.shell运行原理4.内建命令5.替换三、整体代码一、前言 前面学到了进程创建,进程终止,进程等待,进程替换,那么通过这些来制作一个简易的…...
再获认可!腾讯安全NDR获Forrester权威推荐
近日,国际权威研究机构Forrester发布最新研究报告《The Network Analysis And Visibility Landscape, Q1 2023》(以下简称“NAV报告”),从网络分析和可视化(NAV)厂商规模、产品功能、市场占有率及重点案例等…...
代码审计之旅之百家CMS
前言 之前审计的CMS大多是利用工具,即Seay昆仑镜联动扫描出漏洞点,而后进行审计。感觉自己的能力仍与零无异,因此本次审计CMS绝大多数使用手动探测,即通过搜索危险函数的方式进行漏洞寻找,以此来提升审计能力…...
ONLYOFFICE中利用chatGPT帮助我们策划一场生日派对
近日,人工智能chatGPT聊天机器人爆火,在去年年底发布后,仅仅两个月就吸引了全球近一亿的用户,成为史上最快的应用消费程序,chatGPT拥有强大的学习和交互能力 可以被学生,教师,上班族各种职业运…...
Java面试题-线程(一)
在典型的 Java 面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程,如何创建线程,用什么方式创建线程比较好(比如:继承 thread 类还是调用 Runnable 接口),…...
一篇普通的bug日志——bug的尽头是next吗?
文章目录[bug 1] TypeError: method object is not subscriptable[bug 2] TypeError: unsupported format string passed to numpy.ndarray.__format__[bug 3] ValueError:Hint: Expected dtype() paddle::experimental::CppTypeToDataType<T>::Type()[bug 4] CondaSSLE…...
Vue 3 第八章:Watch侦听器
文章目录Watch侦听器1. 基础概念1.1. Watch的基本用法例子1:监听单个ref的值,直接监听例子2:监听多个ref的值,采用数组形式例子3:深度监听例子4:监听reactive响应式对象单一属性,采用回调函数的…...
GlassFish的安装与使用
一、产品下载与安装glassfish下载地址:https://download.oracle.com/glassfish/5.0.1/release/index.html下载后解压即完成安装,主要目录说明:bin目录:为asadmin命令所在目录。glassfish为主目录:glassfish\bin目录为命…...
【java】Java 重写(Override)与重载(Overload)
文章目录重写(Override)方法的重写规则Super 关键字的使用重载(Overload)重载规则实例重写与重载之间的区别总结重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于…...
OpenCV-PyQT项目实战(12)项目案例08:多线程视频播放
欢迎关注『OpenCV-PyQT项目实战 Youcans』系列,持续更新中 OpenCV-PyQT项目实战(1)安装与环境配置 OpenCV-PyQT项目实战(2)QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战(3)信号与槽机制 …...
面向对象设计模式:结构型模式之装饰器模式
文章目录一、引入二、装饰器模式2.1 Intent 意图2.2 Applicability 适用性2.3 类图2.4 优缺点2.5 应用实例:Java IO 类2.6 应用实例:咖啡馆订购系统一、引入 咖啡馆订购系统 Initial 初始 4 种咖啡 House blend (混合咖啡)Dark Roast (深度烘培)Decaf (…...
Unity iOS 无服务器做一个排行榜 GameCenter
排行榜需求解决方案一(嗯目前只有一)UnityEngine.SocialPlatformsiOS GameCenterAppStoreConnect配置Unity 调用(如果使用GameCenter系统的面板,看到这里就可以了)坑(需要获取数据做自定义面板的看这里)iOS代码Unity 代码吐槽需求 需求:接入…...
现在招个会自动化测试的人是真难呀~你会个锤子的自动化测试
现在招个会自动化测试的人是真难呀~ 前一段时间公司计划要招2个自动化测试到岗,同事面试了十几个来应聘的人,发现一个很奇怪的现象,在面试的时候,如果问的是框架API、脚本编写这些问题,基本上所有人都能对答如流&…...
OracleDatabase——数据库表空间dmp导出与导入
由于公司的程序一直部署在客户现场内网,内网调试难度高,一般是有备份还原数据库的需求,这里简记备份(导出)数据库dmp文件与恢复(导入)的步骤。 一、导出dmp文件 exp与expdp命令异同 相同点&a…...
20张图带你彻底了解ReentrantLock加锁解锁的原理
哈喽大家好,我是阿Q。 最近是上班忙项目,下班带娃,忙的不可开交,连摸鱼的时间都没有了。今天趁假期用图解的方式从源码角度给大家说一下ReentrantLock加锁解锁的全过程。系好安全带,发车了。 简单使用 在聊它的源码…...
Dockerfile构建Springboot镜像
Dockerfile构建Springboot镜像 文章目录 Dockerfile构建Springboot镜像 简介实例演示 前期准备 Docker环境Springboot项目Dockerfile文件 Windows 要求构建镜像启动测试 Linux 要求构建镜像启动测试 简介 容器技术大流行的时代,也是docker大流行的时代。 此文…...
从深分页查询到覆盖索引
最近看到一道面试题,如何优化深分页查询 最简单的例子是 select * from web_bill_main limit 30000,10;分页达到30000行,需要把前面29999行都过滤掉,才能找到这10条数据 所以整体时间花了80ms(工具显示时间) 我当时的第一反应是࿰…...
Go语言学习的第三天--下部分(Gin框架的基础了解)
每天都会分享Go的知识,喜欢的朋友关注一下。每天的学习分成两部分基础(必要的,基础不牢地动山摇),另一部分是Go的一些框架知识(会不定时发布,因为小Wei也是一名搬砖人)。但是可以保证…...
JDK的动态代理(powernode 文档)(内含源代码)
JDK的动态代理(powernode 文档)(内含源代码) 源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87546086 一、动态代理 目录JDK的动态代理(powernode 文档)࿰…...
第1章 多线程基础
第1章 多线程基础 1.1.2 线程与进程的关系 进程可以看成是线程的容器,而线程又可以看成是进程中的执行路径。 1.2 多线程启动 线程有两种启动方式:实现Runnable接口;继承Thread类并重写run()方法。 执行进程中的任务时才会产生线程&a…...
网站文字编辑怎么做/专业做网站官网
摘要:本节介绍各种SQL语句。本节介绍有关数据库级的SQL以及相关操作,查看、建立和删除等操作。从本节开始正式介绍各种SQL语句。本节介绍有关数据库级的SQL以及相关操作,查看、建立和删除等操作。用SHOW显示已有的数据库句法:SHOW…...
上海市网站建设公司/中国推广网站
在数据库的物理目录中(mysql的data目录),进入union数据库目录,查看是否有文件存在,若存在,使用rm -rf 命令清除;再次执行删除数据库命令:drop database union;...
wordpress如何编辑网页加代码/企业seo网站推广
带有ResponseStatus注解的异常类会被ResponseStatusExceptionResolver 解析。 可以实现自定义的一些异常,同时在页面上进行显示。具体的使用方法如下: 1.首先定义一个异常类: ResponseStatus(value HttpStatus.FORBIDDEN,reason "用户名和密码不匹配!"…...
情感网站seo/站长seo工具
Go 错误处理 在Go里面通常采用显式返回错误代码的方式来进行错误处理。这个和Java或者Ruby里面使用异常或者是C 里面运行正常返回结果,发生错误返回错误代码的方式不同。Go的这种错误处理的方式使得我们能够很容 易看出哪些函数可能返回错误,并且能够像调…...
网站建设的报价为什么不同/网络营销推广方法
简单的声乐知识 所谓"C,D,E,F,G,A,B".其中E-F和B-C之间是半音关系.其它都是全音关系. 如果原来的伴奏调是E调的话,选择了降两个半音,就转变成D调了.钢琴谱升调用#,如#C,DO升半调降调用b,如bE MI降半调。如果bF 就是FA降 到 MI了…...
wordpress优秀的主题/东莞网站优化关键词排名
List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。Set和Map容器都有基于哈希…...