00 前言

在进行mysql性能优化的时候,第一个想到的便是查看慢sql。

但是对于慢sql有没有什么好的工具进行分析呢?

推荐两个工具mysqldumpslow及pt-query-digest。

mysqlslowdump较为简单,常用命令:

  1. #得到返回记录最多的20个sql
  2. mysqldumpslow -s r -t 20 slowSQl.log
  3. # 得到平均访问次数最多的20条sql
  4. mysqldumpslow -s ar -t 20 slowSQl.log

如果linux上没有安装mysqldumpslow,yum install安装下就行了。

本文主要说下pt-query-digest。

pt-query-digest可以非常清晰地将slowSQL分析出来,类似oracle的AWR报告。

  1. # Rank Query ID Response time Calls R/Call V/M
  2. # ==== =============================== =============== ===== ====== =====
  3. # 1 0xABD1DCCCCD5AA5128E10C27B34... 1246.6948 41.7% 283 4.4053 0.04 UPDATE ziweidashi_deviceinfo
  4. # 2 0x6914B81AAD1785E50708ABD113... 877.6900 29.3% 339 2.5891 0.09 SELECT birthDay_notify
  5. # 3 0x44D9474C6D5C58DD07B5FEEA0D... 299.4193 10.0% 71 4.2172 0.05 SELECT tmall_product_orders
  6. # 4 0xA9BE84CBE3DAA9B1CDD9B5A9EC... 127.0137 4.2% 46 2.7612 0.04 SELECT daily_user_action_log
  7. # 5 0xCF0E12117C971C3013142E3717... 118.3138 4.0% 49 2.4146 0.05 SELECT tmall_user_take_coupon_record
  8. # 6 0x94263184D24186330B13193534... 97.0805 3.2% 35 2.7737 0.56 SELECT tgg_users
  9. # 7 0xC51165F1287A2ECDA221AC1F54... 52.5870 1.8% 22 2.3903 0.04 SELECT util_user_task_log
  10. # 8 0xB8004D6D8A7A7967E04CD81E26... 43.7895 1.5% 16 2.7368 0.08 SELECT daily_user_action_log
  11. # 9 0x910E19224F33DAA6391927B8E8... 41.3720 1.4% 15 2.7581 1.17 SELECT qifugong_tianbi_record
  12. # MISC 0xMISC 86.7871 2.9% 30 2.8929 0.0 <12 ITEMS>

并且不只可以分析慢SQL日志,还可以分析binlog、general log。

此外,pt-query-digest是percona-toolkit工具包的其中一个工具。

这个工具包下还有很多实用的性能分析辅助工具。

01 安装排坑

1、下载

  1. # 进入安装目录
  2. cd /usr/local/src
  3. # 下载percona-toolkit 工具包
  4. wget percona.com/get/percona-toolkit.tar.gz
  5. # 解压
  6. tar zxf percona-toolkit.tar.gz
  7. # 进入解压文件夹
  8. cd /usr/local/src/percona-toolkit-3.1.0
  9. # 安装perl模块,制定依赖路径
  10. perl Makefile.PL PREFIX=/usr/local/percona-toolkit

2、报错 prerequisite DBD::mysql 3 not found

报错如下,找不到DBD包

  1. [root@iZ2zebthf35ejlps5v87ksZ percona-toolkit-3.1.0]# perl Makefile.PL PREFIX=/usr/local/percona-toolkit
  2. Checking if your kit is complete...
  3. Looks good
  4. Warning: prerequisite DBD::mysql 3 not found.
  5. Warning: prerequisite DBI 1.46 not found.
  6. Writing Makefile for percona-toolkit

百度问题,找到链接,https://blog.csdn.net/heizistudio/article/details/45724707?locationNum=8&fps=1

安装依赖包

  1. yum install perl-DBD-MySQL

然后重新执行命令

  1. [root@iZ2zebthf35ejlps5v87ksZ percona-toolkit-3.1.0]# perl Makefile.PL PREFIX=/usr/local/percona-toolkit
  2. Writing Makefile for percona-toolkit

3、安装

  1. make && make install

安装后内容如下

  1. ……
  2. Installing /usr/local/percona-toolkit/bin/pt-summary
  3. Installing /usr/local/percona-toolkit/bin/pt-table-sync
  4. Appending installation info to /usr/local/percona-toolkit/lib64/perl5/perllocal.pod

4、使用

  1. [root@iZ2zebthf35ejlps5v87ksZ bin]# pt-query-digest /usr/local/mysql/data/slow.log
  2. -bash: pt-query-digest: command not found

发现没找到pt-query-digest命令,是因为bash命令默认是从/usr/bin下找的;

如果rpm安装,会默认添加到/usr/bin下;

而我们现在是编译二进制安装到,并且默认是装到了/usr/local/percona-toolkit下,发现本文件夹下有个bin目录,pt工具都在其下。

  1. -rwxrwxr-x 1 hc hc 41747 Sep 16 2019 pt-align
  2. -rwxrwxr-x 1 hc hc 270675 Sep 16 2019 pt-archiver
  3. -rwxrwxr-x 1 hc hc 170783 Sep 16 2019 pt-config-diff
  4. -rwxrwxr-x 1 hc hc 167978 Sep 16 2019 pt-deadlock-logger
  5. -rwxrwxr-x 1 hc hc 166450 Sep 16 2019 pt-diskstats
  6. -rwxrwxr-x 1 hc hc 171099 Sep 16 2019 pt-duplicate-key-checker
  7. -rwxrwxr-x 1 hc hc 50157 Sep 16 2019 pt-fifo-split
  8. -rwxrwxr-x 1 hc hc 151809 Sep 16 2019 pt-find
  9. -rwxrwxr-x 1 hc hc 67304 Sep 16 2019 pt-fingerprint
  10. -rwxrwxr-x 1 hc hc 134955 Sep 16 2019 pt-fk-error-logger
  11. -rwxrwxr-x 1 hc hc 223887 Sep 16 2019 pt-heartbeat
  12. -rwxrwxr-x 1 hc hc 228213 Sep 16 2019 pt-index-usage
  13. -rwxrwxr-x 1 hc hc 32405 Sep 16 2019 pt-ioprofile
  14. -rwxrwxr-x 1 hc hc 256092 Sep 16 2019 pt-kill
  15. -rwxrwxr-x 1 hc hc 21913 Sep 16 2019 pt-mext
  16. -rwxrwxr-x 1 hc hc 8196032 Sep 16 2019 pt-mongodb-query-digest
  17. -rwxrwxr-x 1 hc hc 8522944 Sep 16 2019 pt-mongodb-summary
  18. -rwxrwxr-x 1 hc hc 108113 Sep 16 2019 pt-mysql-summary
  19. -rwxrwxr-x 1 hc hc 426996 Sep 16 2019 pt-online-schema-change
  20. -rwxrwxr-x 1 hc hc 4794784 Sep 16 2019 pt-pg-summary
  21. -rwxrwxr-x 1 hc hc 24598 Sep 16 2019 pt-pmp
  22. -rwxrwxr-x 1 hc hc 527607 Sep 16 2019 pt-query-digest
  23. -rwxrwxr-x 1 hc hc 3624992 Sep 16 2019 pt-secure-collect
  24. -rwxrwxr-x 1 hc hc 78242 Sep 16 2019 pt-show-grants
  25. -rwxrwxr-x 1 hc hc 37784 Sep 16 2019 pt-sift
  26. -rwxrwxr-x 1 hc hc 146952 Sep 16 2019 pt-slave-delay
  27. -rwxrwxr-x 1 hc hc 131404 Sep 16 2019 pt-slave-find
  28. -rwxrwxr-x 1 hc hc 184944 Sep 16 2019 pt-slave-restart
  29. -rwxrwxr-x 1 hc hc 76226 Sep 16 2019 pt-stalk
  30. -rwxrwxr-x 1 hc hc 90816 Sep 16 2019 pt-summary
  31. -rwxrwxr-x 1 hc hc 459729 Sep 16 2019 pt-table-checksum
  32. -rwxrwxr-x 1 hc hc 405119 Sep 16 2019 pt-table-sync
  33. -rwxrwxr-x 1 hc hc 247743 Sep 16 2019 pt-table-usage
  34. -rwxrwxr-x 1 hc hc 333011 Sep 16 2019 pt-upgrade
  35. -rwxrwxr-x 1 hc hc 178415 Sep 16 2019 pt-variable-advisor
  36. -rwxrwxr-x 1 hc hc 102545 Sep 16 2019 pt-visual-explain

本次使用到主力工具,pt-query-digest,执行命令,进行慢日志分析

  1. ./pt-query-digest /usr/local/mysql/data/slow.log

5、又报错 Can't locate Digest/MD5.pm in @INC

  1. [root@iZ2zebthf35ejlps5v87ksZ bin]# ./pt-query-digest /usr/local/mysql/data/slow.log
  2. Can't locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./pt-query-digest line 2470.
  3. BEGIN failed--compilation aborted at ./pt-query-digest line 2470.

安装perl-Digest-MD5工具

  1. yum -y install perl-Digest-MD5

终于可以运行了

  1. ./pt-query-digest /usr/local/mysql/data/slow.log

6、无脑命令如下

  1. yum -y install perl-DBD-MySQL
  2. yum -y install perl-Digest-MD5
  3. cd /usr/local/src
  4. wget percona.com/get/percona-toolkit.tar.gz
  5. tar zxf percona-toolkit.tar.gz
  6. cd /usr/local/src/percona-toolkit-3.1.0
  7. perl Makefile.PL PREFIX=/usr/local/percona-toolkit
  8. make && make install

二、分析实战

1、执行工具pt-query-digest

  1. ./pt-query-digest /usr/local/src/slowsqlExample/slow0312.log

2、结果分析

找了一个慢sql,分析结果如下

  1. [root@iZ2zebthf35ejlps5v87ksZ bin]# ./pt-query-digest /usr/local/src/slowsqlExample/slow0312.log
  2. 第一部分
  3. 该工具执行日志分析的用户时间,系统时间,物理内存占用大小,虚拟内存占用大小
  4. # 360ms user time, 10ms system time, 22.56M rss, 187.09M vsz
  5. 工具执行时间
  6. # Current date: Fri Mar 20 22:54:14 2020
  7. 运行分析工具的主机名
  8. # Hostname: iZ2zebthf35ejlps5v87ksZ
  9. 被分析的文件名
  10. # Files: /usr/local/src/slowsqlExample/slow0312.log
  11. 语句总数量,唯一的语句数量,QPS,并发数
  12. # Overall: 906 total, 21 unique, 0.02 QPS, 0.07x concurrency _____________
  13. 日志记录的时间范围
  14. # Time range: 2020-03-11 12:22:13 to 2020-03-12 00:16:57
  15. # Attribute total min max avg 95% stddev median
  16. # ============ ======= ======= ======= ======= ======= ======= =======
  17. 语句执行时间
  18. # Exec time 2991s 2s 10s 3s 5s 1s 3s
  19. 锁占用时间
  20. # Lock time 552ms 24us 371ms 609us 103us 12ms 57us
  21. 发送到客户端的行数
  22. # Rows sent 167.53k 0 17.99k 189.35 487.09 1.22k 0
  23. select语句扫描行数
  24. # Rows examine 980.73M 238 1.96M 1.08M 1.95M 757.80k 753.18k
  25. 查询的字符数
  26. # Query size 258.71k 17 1.77k 292.41 463.90 202.02 329.68
  27. 第二部分
  28. # Profile
  29. Rank:所有语句的排名,默认按查询时间降序排列,通过--order-by指定
  30. Query ID:语句的ID,(去掉多余空格和文本字符,计算hash值)
  31. Response:总的响应时间
  32. time:该查询在本次分析中总的时间占比
  33. calls:执行次数,即本次分析总共有多少条这种类型的查询语句
  34. R/Call:平均每次执行的响应时间
  35. V/M:响应时间Variance-to-mean的比率
  36. Item:查询对象
  37. # Rank Query ID Response time Calls R/Call V/M
  38. # ==== =============================== =============== ===== ====== =====
  39. # 1 0xABD1DCCCCD5AA5128E10C27B34... 1246.6948 41.7% 283 4.4053 0.04 UPDATE ziweidashi_deviceinfo
  40. # 2 0x6914B81AAD1785E50708ABD113... 877.6900 29.3% 339 2.5891 0.09 SELECT birthDay_notify
  41. # 3 0x44D9474C6D5C58DD07B5FEEA0D... 299.4193 10.0% 71 4.2172 0.05 SELECT tmall_product_orders
  42. # 4 0xA9BE84CBE3DAA9B1CDD9B5A9EC... 127.0137 4.2% 46 2.7612 0.04 SELECT daily_user_action_log
  43. # 5 0xCF0E12117C971C3013142E3717... 118.3138 4.0% 49 2.4146 0.05 SELECT tmall_user_take_coupon_record
  44. # 6 0x94263184D24186330B13193534... 97.0805 3.2% 35 2.7737 0.56 SELECT tgg_users
  45. # 7 0xC51165F1287A2ECDA221AC1F54... 52.5870 1.8% 22 2.3903 0.04 SELECT util_user_task_log
  46. # 8 0xB8004D6D8A7A7967E04CD81E26... 43.7895 1.5% 16 2.7368 0.08 SELECT daily_user_action_log
  47. # 9 0x910E19224F33DAA6391927B8E8... 41.3720 1.4% 15 2.7581 1.17 SELECT qifugong_tianbi_record
  48. # MISC 0xMISC 86.7871 2.9% 30 2.8929 0.0 <12 ITEMS>
  49. 第三及后续部分,第一条查询语句 query id0xABD1DCCCCD5AA5128E10C27B34BC04E7
  50. # Query 1: 0.01 QPS, 0.03x concurrency, ID 0xABD1DCCCCD5AA5128E10C27B34BC04E7 at byte 355748
  51. # Scores: V/M = 0.04
  52. # Time range: 2020-03-11 12:24:03 to 2020-03-12 00:16:13
  53. # Attribute pct total min max avg 95% stddev median
  54. # ============ === ======= ======= ======= ======= ======= ======= =======
  55. # Count 31 283
  56. # Exec time 41 1247s 4s 8s 4s 5s 437ms 4s
  57. # Lock time 69 386ms 24us 371ms 1ms 93us 21ms 44us
  58. # Rows sent 0 0 0 0 0 0 0 0
  59. # Rows examine 18 180.00M 651.14k 651.45k 651.29k 650.62k 0 650.62k
  60. # Query size 10 27.64k 100 100 100 100 0 100
  61. # String:
  62. 数据库名
  63. # Databases taxen_ziweidashi
  64. 执行主机
  65. # Hosts 118.190.93.166
  66. 执行用户
  67. # Users devAccount
  68. 查询时间占比
  69. # Query_time distribution
  70. # 1us
  71. # 10us
  72. # 100us
  73. # 1ms
  74. # 10ms
  75. # 100ms
  76. # 1s ################################################################
  77. # 10s+
  78. # Tables
  79. # SHOW TABLE STATUS FROM `taxen_ziweidashi` LIKE 'ziweidashi_deviceinfo'\G
  80. # SHOW CREATE TABLE `taxen_ziweidashi`.`ziweidashi_deviceinfo`\G
  81. UPDATE ziweidashi_deviceinfo
  82. SET expired = 1
  83. WHERE createTime <= 1583942580685\G
  84. # Converted for EXPLAIN
  85. # EXPLAIN /*!50100 PARTITIONS*/
  86. select expired = 1 from ziweidashi_deviceinfo where createTime <= 1583942580685\G
  87. # Query 2: 0.03 QPS, 0.07x concurrency, ID 0x6914B81AAD1785E50708ABD11319E02E at byte 13829
  88. # Scores: V/M = 0.09
  89. # Time range: 2020-03-11 12:22:13 to 16:05:47
  90. # Attribute pct total min max avg 95% stddev median
  91. # ============ === ======= ======= ======= ======= ======= ======= =======
  92. # Count 37 339
  93. # Exec time 29 878s 2s 4s 3s 4s 472ms 2s
  94. # Lock time 5 29ms 31us 4ms 86us 98us 229us 66us
  95. # Rows sent 0 24 0 2 0.07 0 0.32 0
  96. # Rows examine 67 665.20M 1.96M 1.96M 1.96M 1.96M 0 1.96M
  97. # Query size 59 154.47k 462 467 466.60 463.90 2.07 463.90
  98. # String:
  99. # Hosts 10.66.186.115
  100. # Users root
  101. # Query_time distribution
  102. # 1us
  103. # 10us
  104. # 100us
  105. # 1ms
  106. # 10ms
  107. # 100ms
  108. # 1s ################################################################
  109. # 10s+
  110. # Tables
  111. # SHOW TABLE STATUS LIKE 'birthDay_notify'\G
  112. # SHOW CREATE TABLE `birthDay_notify`\G
  113. # EXPLAIN /*!50100 PARTITIONS*/
  114. select birthdayno0_.id as id1_1_, birthdayno0_.index_card_show_date as index_ca2_1_, birthdayno0_.userId as userId3_1_, birthdayno0_.push_content as push_con4_1_, birthdayno0_.card_content as card_con5_1_, birthdayno0_.birthday_userId as birthday6_1_, birthdayno0_.birthday_contactId as birthday7_1_, birthdayno0_.need_push as need_pus8_1_ from birthDay_notify birthdayno0_ where birthdayno0_.userId=1304747 and birthdayno0_.index_card_show_date='2020-03-11 00:00:00'\G
  115. ……省略

3、实例优化

找出这几条语句,对症下药,进行写法的修改、索引的设计,基本可以解决慢SQL问题。

例如query1的语句

  1. UPDATE ziweidashi_deviceinfo
  2. SET expired = 1
  3. WHERE createTime <= 1583942580685

分析后发现,这张表大部分数据的expired字段都是1,每次update都相当于全表查询、锁定了一次。

从逻辑上分析,是expired不等于1才修改的。

可以修改为

  1. UPDATE ziweidashi_deviceinfo
  2. SET expired = 1
  3. WHERE createTime <= 1583942580685
  4. and expired != 1

直接从平均的5秒执行时间降低到了0.04秒。

其他语句类似。

三、常用命令

1.分析慢查询文件

  1. pt-query-digest slow.log > slow_report.log

2.分析最近12小时内的查询

  1. pt-query-digest --since=12h slow.log > slow_report2.log

3.分析指定时间范围内的查询

  1. pt-query-digest slow.log --since '2017-01-07 09:30:00' --until '2017-01-07 10:00:00'> > slow_report3.log

4、通过tcpdump抓取mysql的tcp协议数据,然后再分析

  1. tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
  2. pt-query-digest --type tcpdump mysql.tcp.txt> slow_report9.log

5、分析binlog

mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql

pt-query-digest --type=binlog mysql-bin000093.sql > slow_report10.log

6、分析general log

  1. pt-query-digest --type=genlog localhost.log > slow_report11.log

四、参考资料

1、高性能mysql(第三版)

2、MySQL慢查询分析工具pt-query-digest详解 作者:枫叶工作室。

3、Warning: prerequisite DBD::mysql 3 not found 作者:ora600

4、使用lcov时遇到错误can't locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 ...的错误 作者:迷茫的叶

5、percona官网

mysql慢查询分析工具比较与实战的更多相关文章

  1. Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解

    Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解   Mysql慢查询开启 Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应 ...

  2. mysql慢查询分析工具 mysqlsla 安装

    概述 mysqlsla 是一款很不错的mysql慢查询日志分析工具,而且简单易用.mysqlsla 是用perl编写的脚本,运行需要perl-DBI和per-DBD-Mysql两模块的支持.mysql ...

  3. MySQL慢查询分析工具pt-query-digest详解

    一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...

  4. Linux下MySQL慢查询分析mysqlsla安装使用

    说明: 操作系统:CentOS 5.X 64位 MySQL版本:mysql-5.5.35 MySQL配置文件:/etc/my.cnf MySQL 数据库存放目录:/data/mysql 实现目的:开启 ...

  5. mysql慢查询分析

    mysql慢查询分析 Posted: 29. 08. 2014 | Author: zdz | Category: mysql MySQL 慢查询日志分析 1. pt-query-digest分析慢查 ...

  6. Red Gate系列之七 SQL Search 1.1.6.1 Edition SQL查询分析工具使用教程

    原文:Red Gate系列之七 SQL Search 1.1.6.1 Edition SQL查询分析工具使用教程 Red Gate系列之七 SQL Search 1.1.6.1 Edition SQL ...

  7. mysqlsla慢查询分析工具教程

    mysqlsla是一款帮助语句分析.过滤.和排序的功能,能够处理MySQL慢查询日志.二进制日志等.整体来说, 功能非常强大. 能制作SQL查询数据报表,分析包括执行频率, 数据量, 查询消耗等. 且 ...

  8. mysql slow log分析工具的比较

    mysql 中的 slow log 是用来记录执行时间较长(超过 long_query_time 秒)的 sql 的一种日志工具. 启用 slow log 在 my.cnf 中设置 [mysqld] ...

  9. (转)MySQL慢查询分析优化 + MySQL调优

    .long_query_time的默认值为10,意思是运行10S以上的语句. .临时设置开启慢查询日志 mysql> show variables like '%slow_query_log%' ...

随机推荐

  1. API服务版本控制 Microsoft.AspNetCore.Mvc.Versioning

    我们在进行webapi服务开发时,会遇到一些多个版本的api共存的情况发生,例如某一版本APP上线后,需求发生变更,需要在下一个升级版本更新API,但同时又需要保证这个APP版本能正常使用,这时候就需 ...

  2. 用Setuptools构建和分发程序包

    目录 使用Setuptools构建和分发软件包 开发人员指南 安装setuptools 基本使用 指定项目的版本 新增和更改的setup()关键字 包括数据文件 参考示例 使用Setuptools构建 ...

  3. 【牛客】乃爱与城市拥挤程度 — 树形dp,up and down

    我太难了 这题做得我要死了,来来回回写了大概八九个小时 错误的原因要么是快速幂写错(一生之敌,要么是忘取模爆\(longlong\)变负数\(QAQ\) \(update\) \(2019.11.13 ...

  4. 【Weiss】【第03章】栈例程

    写栈比队列更简单一些,毕竟只有一个数据出入口. 之前用C在程序里模拟栈代替递归的时候,直接搞个数组来实现都是非常轻松愉快的事情. 不多说,放代码. 测试代码 #include <iostream ...

  5. Python - 面向对象(三)公共变量,受保护变量,私有变量

    前言 在Python的类里面,所有属性和方法默认都是公共的:但Python也可以设置受保护.私有类型的变量or方法 受保护类型的变量.方法 一般称为:protected变量 #!/usr/bin/en ...

  6. Android UI性能测试——使用 Systrace 查找问题

    一 官方文档翻译 官文地址:https://developer.android.com/studio/command-line/systrace systrace命令允许您在系统级别上收集和检查所有运 ...

  7. Fiddler4 手机抓包

    1.要对计算机Fiddler进行配置,允许远程计算机连接. 2.保证手机电脑在同一局域网中. 3.手机上设置代理服务器.以华为手机为例,设置-->WLAN-->找到并长按目前所连接的WiF ...

  8. SSL/TLS 安全测试

    本文介绍了使用半自动化工具执行SSL&TLS安全性评估的过程,以及如何使用手动及工具的测试方法验证并发现问题.目的是优化TLS和SSL安全测试流程,帮助信息安全顾问在渗透测试时在TLS / S ...

  9. datetime和time

    datetime和time 1.datetime模块 import datetimenow = datetime.datetime.now() #时间对象print(now,type(now))pri ...

  10. 修改imx6ull开机LOGO(一)

    imx6ull启动的时候默认显示uboot自带的开机画面,按照如下步骤修改为我们想要的开机画面,如下: 首先去掉液晶屏右上角的打印信息   修改/drivers/video/cfb_console.c ...