转:

MySQL 慢查询日志介绍

2018年08月23日 08:47:40 曾梦想仗剑走天涯XX 阅读数 1104
 

一. 慢查询介绍

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过指定阀值的SQL语句,运行时间超过long_query_time值的SQL,会被记录到慢查询日志中。

默认情况下,MySQL数据库并不启动慢查询日志,需要手动开启。如果不是调优需要的话,一般不建议开启,因为开启慢查询日志会或多或少带来一定的性能影响。

SQL Server中我们利用SQL Profile来记录SQL执行情况,在Oracle中我们可以使用AWR、ASH报告来分析历史SQL执行情况,类似的调优方式映射到MySQL中,即对应为慢查询日志

二. 参数介绍

介绍与慢查询日志相关的参数

slow_query_log:是否开启慢查询日志,1表示开启,0表示关闭。

slow_query_log_file:MySQL慢查询日志存储路径。

long_query_time :慢查询阈值(s),当查询时间多于设定的阈值时,记录日志。

log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中。

log_throttle_queries_not_using_indexes:表示每分钟允许记录到slow_log的且未使用索引的sql语句次数(0为无限制,如果为固定值,可能会记录不到sql)。

log_output:日志存储方式。’FILE’表示存入文件,‘TABLE’表示存入系统表。因为FILE模式开销比较低,所以默认为FILE。

log_slow_admin_statements = 1: 记录ALTER TABLE等语句引发的慢查询

log_slow_slave_statements = 1:记录从服务器产生的慢查询

min_examined_row_limit = 100 :SQL扫描行数大于等于100行才会被记录

我们可以通过show variables命令查看当前具体的参数值,如下查看当前slow_query_log为OFF,即表示未开启慢查询日志,long_query_time值为2,即表示慢查询阈值为2s。

  1. mysql> show variables like '%slow_query_log%';
  2. +---------------------+----------+
  3. | Variable_name | Value |
  4. +---------------------+----------+
  5. | slow_query_log | OFF |
  6. | slow_query_log_file | slow.log |
  7. +---------------------+----------+
  8.  
  9. mysql> show variables like '%long_query_time%';
  10. +-----------------+----------+
  11. | Variable_name | Value |
  12. +-----------------+----------+
  13. | long_query_time | 2.000000 |
  14. +-----------------+----------+

三. 开启慢查询日志

开启慢查询日志只需要如下修改部分参数即可,这里设置的慢查询阈值为0.1s,项目上可以根据实际情况调整,这边的建议是如果压测可以设置为0.1s,如果是非压测可以设置为2s。由于开启了log_queries_not_using_indexes,所以慢日志不仅会记录超过阈值的SQL,没有走索引的SQL也会记录日志,即使这些SQL并没有超过阈值。过set global设置参数后,只会在新连接中生效,所以要查看修改后的参数值,需要重新连接。

  1. mysql> set global long_query_time = 0.1;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> set global log_queries_not_using_indexes = 1;
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> set global log_throttle_queries_not_using_indexes = 0;
  8. Query OK, 0 rows affected (0.00 sec)
  9.  
  10. mysql> set global min_examined_row_limit = 100;
  11. Query OK, 0 rows affected (0.00 sec)
  12.  
  13. mysql> set global slow_query_log = 1;
  14. Query OK, 0 rows affected (0.00 sec)

四. 日志内容

我们得到慢查询日志后,最重要的一步就是去分析这个日志。我们先来看下慢日志里到底记录了哪些内容。

如下图是慢日志里其中一条SQL的记录内容,可以看到有时间戳,用户,查询时长及具体的SQL等,内容其实是很齐全的。但是存在一个问题,慢日志里往往有许多SQL,不可能一条一条SQL看过去,我们需要将所有的慢SQL分组统计后在进行分析。

  1. # Time: 2018-08-16T00:00:04.821003+08:00
  2. # User@Host: zwfwroot[zwfwroot] @ 19.15.0.30 [19.15.0.30] Id: 67508
  3. # Schema: gdqlk Last_errno: 0 Killed: 0
  4. # Query_time: 14.344185 Lock_time: 0.000028 Rows_sent: 237064 Rows_examined: 237064 Rows_affected: 0
  5. # Bytes_sent: 96078006
  6. SET timestamp=1534348804;
  7. SELECT * FROM `audit_catalog_lobby`;

五. 日志分析

pt-query-digest是用于分析MySQL慢查询的一个工具,先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,同时把分析结果输出到文件中,我们可以借助分析结果找出问题进行优化。

pt-query-digestpercona-toolkit工具包下的一个工具,如果MySQL是使用Linux_5.7.22版本的bin包安装的话,默认会安装percona-toolkit,可以直接使用pt-query-digest命令来分析慢查询日志。

Linux下使用如下命令分析指定时间范围内的慢查询,slow.log需要指定具体路径,slow_report.log指定输出文件。

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

下面介绍通过pt-query-digest分析slow.log后得到的slow_report.log文件。

文件内容总体分成3个部分,第一部分为总体统计结果第二部分为查询分组统计结果第三部分为每一类查询的详细统计结果

(1) 总体统计结果


Overall:查询总数、唯一查询数量、QPS、并发 
Time range:查询的时间范围 
Exec time :执行时间 
Lock time:被阻塞时间 
Rows sent:查询返回行数 
Rows examine : 查询扫描行数 
query size : 查询数据量 
total:总计 min:最小 max:最大 avg:平均 stddev: 标准差 
95%:把所有值从小到大排列,位于95%的值 
median:中位数,把所有值从小到大排列,位于中间的值

(2) 查询分组统计结果


Rank:所有语句的排名,默认按查询总时间降序排列 
Query ID:SQL的ID 
Response:总执行时间 
time:该查询在本次分析中总的时间占比 
calls:执行次数,即本次分析总共有多少条这种类型的查询语句 
R/Call:平均每次执行的响应时间 
V/M:方差均值 
Item:查询对象

 (3) 每个查询的详细统计结果


Query:对应第二部分中的Rank排名 
ID:查询ID号,与Query ID对应 
Time range:查询时间范围 
Attribute:针对此类查询的统计 
Databases:数据库名 
Hosts:执行查询的IP分布(占比) 
Users:各个用户执行的次数(占比) 
Query_time distribution :查询时间分布, 长短体现区间占比,本例中10s以上查询数较多。

六. 总结

项目上可以通过此方法来优化SQL,根据Rank排名先后,依次分析优化SQL即可。

MySQL 慢查询日志介绍的更多相关文章

  1. MySQL查询日志介绍

    MySQL查询日志介绍 MySQL的查询日志记录了所有MySQL数据库请求的信息.无论这些请求是否得到了正确的执行.默认文件名为hostname.log.默认情况下MySQL查询日志是关闭的.生产环境 ...

  2. MySQL慢查询日志总结 日志分析工具mysqldumpslow

    MySQL慢查询日志总结 - 潇湘隐者 - 博客园 https://www.cnblogs.com/kerrycode/p/5593204.html 2016-06-17 10:32 by 潇湘隐者, ...

  3. 读懂mysql慢查询日志

    我们来看一下如何去读懂这些慢查询日志.在跟踪慢查询日志之前,首先你得保证最少发生过一次慢查询.如果你没有可以自己制造一个:root@server# mysql -e 'SELECT SLEEP(8); ...

  4. mysql慢查询日志分析工具 mysqlsla(转)

    mysql数据库的慢查询日志是非常重要的一项调优辅助日志,但是mysql默认记录的日志格式阅读时不够友好,这是由mysql日志记录规则所决定的,捕获一条就记录一条,虽说记录的信息足够详尽,但如果将浏览 ...

  5. MySQL 慢查询日志分析及可视化结果

    MySQL 慢查询日志分析及可视化结果 MySQL 慢查询日志分析 pt-query-digest分析慢查询日志 pt-query-digest --report slow.log 报告最近半个小时的 ...

  6. ELK logstash 处理MySQL慢查询日志(初步)

    写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数 ...

  7. MySQL慢查询日志

    实验环境: OS X EI Captian + MySQL 5.7 一.配置MySQL自动记录慢查询日志 查看变量,也就是配置信息 show (global) variables like '%slo ...

  8. MySQL慢查询日志释疑总结

      之前写了一篇"MySQL慢查询日志总结",总结了一些MySQL慢查询日志常用的相关知识,这里总结一下在工作当中遇到关于MySQL慢查询日志的相关细节问题,有些是释疑或自己有疑惑 ...

  9. 企业级中带你ELK如何实时收集分析Mysql慢查询日志

    什么是Mysql慢查询日志? 当SQL语句执行时间超过设定的阈值时,便于记录到指定的日志文件中或者表中,所有记录称之为慢查询日志 为什么要收集Mysql慢查询日志? 数据库在运行期间,可能会存在这很多 ...

随机推荐

  1. [Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录

    预计阅读时间: 15分钟 环境: win7 + Selenium2.53.6+python2.7 +Firefox 45.2  (具体配置参考 http://www.cnblogs.com/yoyok ...

  2. 7.Vue实例的生命周期

    1.Vue实例的生命周期: 什么是生命周期:从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期! 生命周期钩子 = 生命周期函数 = 生命周期事件 2. 主要的生命 ...

  3. (14)占位符%和format

    # 在介绍占位符之前,这里先介绍下索引,索引可以方便的帮我们拿到容器内的数据 # 索引可以简单的理解为一个有序的标记,我们把容器里的元素每一个都编上一个编号 # 凡是有序的容器类型数据,都可以通过索引 ...

  4. Ubuntu系统---终端下用g++进行c++项目

    Ubuntu系统---终端下用g++进行c++项目 目录 一.编译工具(g++/gcc)和编辑工具(vim/gedit)二.C语言 的编译与运行三.C++语言 的编译与运行四.gcc/g++的详细过程 ...

  5. mysql workbench使用技巧,使用workbench导出部分表

    最近在刚开始用workbench导出数据的时候,需要导出部分表数据,找来半天找不到,原来是选中库之后,不要要点右边的字母,然后表才显示出来 点左边的对勾的话,右边的表是不会显示出来的!

  6. 2019HDU多校第三场F Fansblog——威尔逊定理&&素数密度

    题意 给定一个整数 $P$($10^9 \leq p\leq 1^{14}$),设其前一个质数为 $Q$,求 $Q!  \ \% P$. 分析 暴力...说不定好的板子能过. 根据威尔逊定理,如果 $ ...

  7. 后缀自动机求endpos集大小

    #include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define LNF ...

  8. ajax 页面无刷新

    <!-- 使用原生Ajax 和 $.ajax 实现局部刷新的过程 --><!-- 封装通用XMLHttpRequest对象 --><!DOCTYPE html>&l ...

  9. P2634 [国家集训队]聪聪可可 点分治

    思路:点分治 提交:1次 题解: 不需要什么容斥...接着板子题说: 还是基本思路:对于一颗子树,与之前的子树做贡献. 我们把路径的权值在\(\%3\)意义下分类,即开三个桶\(c[0],c[1],c ...

  10. Asia-Jakarata 2018

    目录 Contest Info Solutions Problem A. Edit Distance Problem C. Smart Thief Problem D.Icy Land Problem ...