对MySQL慢查询日志进行分析的基本教程

 更新时间:2015年12月23日 15:24:28   作者:zdz  
这篇文章主要介绍了对MySQL慢查询日志进行分析的基本教程,文中提到的Query-Digest-UI这个基于B/S的图形化查看工具非常好用,需要的朋友可以参考下

0、首先查看当前是否开启慢查询:

(1)快速办法,运行sql语句

show VARIABLES like "%slow%" 

(2)直接去my.conf中查看。

my.conf中的配置(放在[mysqld]下的下方加入)

[mysqld]

log-slow-queries = /usr/local/mysql/var/slowquery.log
long_query_time = 1 #单位是秒
log-queries-not-using-indexes


使用sql语句来修改:不能按照my.conf中的项来修改的。修改通过"show VARIABLES like "%slow%" "
语句列出来的变量,运行如下sql:

set global log_slow_queries = ON;
set global slow_query_log = ON;
set global long_query_time=0.1; #设置大于0.1s的sql语句记录下来

慢查询日志文件的信息格式:

# Time: 130905 14:15:59   时间是2013年9月5日 14:15:59(前面部分容易看错哦,乍看以为是时间戳)
# User@Host: root[root] @ [183.239.28.174] 请求mysql服务器的客户端ip
# Query_time: 0.735883 Lock_time: 0.000078 Rows_sent: 262 Rows_examined: 262 这里表示执行用时多少秒,0.735883秒,1秒等于1000毫秒

SET timestamp=1378361759;  这目前我还不知道干嘛用的
show tables from `test_db`; 这个就是关键信息,指明了当时执行的是这条语句


1、MySQL 慢查询日志分析
pt-query-digest分析慢查询日志

pt-query-digest –report slow.log

报告最近半个小时的慢查询:

pt-query-digest –report –since 1800s slow.log

报告一个时间段的慢查询:

pt-query-digest –report –since ‘2013-02-10 21:48:59′ –until ‘2013-02-16 02:33:50′ slow.log

报告只含select语句的慢查询:

pt-query-digest –filter ‘$event->{fingerprint} =~ m/^select/i' slow.log

报告针对某个用户的慢查询:

pt-query-digest –filter ‘($event->{user} || “”) =~ m/^root/i' slow.log

报告所有的全表扫描或full join的慢查询:

pt-query-digest –filter ‘(($event->{Full_scan} || “”) eq “yes”) || (($event->{Full_join} || “”) eq “yes”)' slow.log


2、将慢查询日志的分析结果可视化
Query-Digest-UI
其实,这是一个非常简单和直接的工具,浏览和统计Mysql慢查询,基于AJAX的Web界面。
配置Query-Digest-UI:

下载:

wget https://nodeload.github.com/kormoc/Query-Digest-UI/zip/master
 unzip Query-Digest-UI-master.zip

查询分析结果可视化步骤如下:

(1)创建相关数据库表

-- install.sql
-- Create the database needed for the Query-Digest-UI
DROP DATABASE IF EXISTS slow_query_log;
CREATE DATABASE slow_query_log;
USE slow_query_log;
 
-- Create the global query review table
CREATE TABLE `global_query_review` (
 `checksum` bigint(20) unsigned NOT NULL,
 `fingerprint` text NOT NULL,
 `sample` longtext NOT NULL,
 `first_seen` datetime DEFAULT NULL,
 `last_seen` datetime DEFAULT NULL,
 `reviewed_by` varchar(20) DEFAULT NULL,
 `reviewed_on` datetime DEFAULT NULL,
 `comments` text,
 `reviewed_status` varchar(24) DEFAULT NULL,
 PRIMARY KEY (`checksum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- Create the historical query review table
CREATE TABLE `global_query_review_history` (
 `hostname_max` varchar(64) NOT NULL,
 `db_max` varchar(64) DEFAULT NULL,
 `checksum` bigint(20) unsigned NOT NULL,
 `sample` longtext NOT NULL,
 `ts_min` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `ts_max` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `ts_cnt` float DEFAULT NULL,
 `Query_time_sum` float DEFAULT NULL,
 `Query_time_min` float DEFAULT NULL,
 `Query_time_max` float DEFAULT NULL,
 `Query_time_pct_95` float DEFAULT NULL,
 `Query_time_stddev` float DEFAULT NULL,
 `Query_time_median` float DEFAULT NULL,
 `Lock_time_sum` float DEFAULT NULL,
 `Lock_time_min` float DEFAULT NULL,
 `Lock_time_max` float DEFAULT NULL,
 `Lock_time_pct_95` float DEFAULT NULL,
 `Lock_time_stddev` float DEFAULT NULL,
 `Lock_time_median` float DEFAULT NULL,
 `Rows_sent_sum` float DEFAULT NULL,
 `Rows_sent_min` float DEFAULT NULL,
 `Rows_sent_max` float DEFAULT NULL,
 `Rows_sent_pct_95` float DEFAULT NULL,
 `Rows_sent_stddev` float DEFAULT NULL,
 `Rows_sent_median` float DEFAULT NULL,
 `Rows_examined_sum` float DEFAULT NULL,
 `Rows_examined_min` float DEFAULT NULL,
 `Rows_examined_max` float DEFAULT NULL,
 `Rows_examined_pct_95` float DEFAULT NULL,
 `Rows_examined_stddev` float DEFAULT NULL,
 `Rows_examined_median` float DEFAULT NULL,
 `Rows_affected_sum` float DEFAULT NULL,
 `Rows_affected_min` float DEFAULT NULL,
 `Rows_affected_max` float DEFAULT NULL,
 `Rows_affected_pct_95` float DEFAULT NULL,
 `Rows_affected_stddev` float DEFAULT NULL,
 `Rows_affected_median` float DEFAULT NULL,
 `Rows_read_sum` float DEFAULT NULL,
 `Rows_read_min` float DEFAULT NULL,
 `Rows_read_max` float DEFAULT NULL,
 `Rows_read_pct_95` float DEFAULT NULL,
 `Rows_read_stddev` float DEFAULT NULL,
 `Rows_read_median` float DEFAULT NULL,
 `Merge_passes_sum` float DEFAULT NULL,
 `Merge_passes_min` float DEFAULT NULL,
 `Merge_passes_max` float DEFAULT NULL,
 `Merge_passes_pct_95` float DEFAULT NULL,
 `Merge_passes_stddev` float DEFAULT NULL,
 `Merge_passes_median` float DEFAULT NULL,
 `InnoDB_IO_r_ops_min` float DEFAULT NULL,
 `InnoDB_IO_r_ops_max` float DEFAULT NULL,
 `InnoDB_IO_r_ops_pct_95` float DEFAULT NULL,
 `InnoDB_IO_r_bytes_pct_95` float DEFAULT NULL,
 `InnoDB_IO_r_bytes_stddev` float DEFAULT NULL,
 `InnoDB_IO_r_bytes_median` float DEFAULT NULL,
 `InnoDB_IO_r_wait_min` float DEFAULT NULL,
 `InnoDB_IO_r_wait_max` float DEFAULT NULL,
 `InnoDB_IO_r_wait_pct_95` float DEFAULT NULL,
 `InnoDB_IO_r_ops_stddev` float DEFAULT NULL,
 `InnoDB_IO_r_ops_median` float DEFAULT NULL,
 `InnoDB_IO_r_bytes_min` float DEFAULT NULL,
 `InnoDB_IO_r_bytes_max` float DEFAULT NULL,
 `InnoDB_IO_r_wait_stddev` float DEFAULT NULL,
 `InnoDB_IO_r_wait_median` float DEFAULT NULL,
 `InnoDB_rec_lock_wait_min` float DEFAULT NULL,
 `InnoDB_rec_lock_wait_max` float DEFAULT NULL,
 `InnoDB_rec_lock_wait_pct_95` float DEFAULT NULL,
 `InnoDB_rec_lock_wait_stddev` float DEFAULT NULL,
 `InnoDB_rec_lock_wait_median` float DEFAULT NULL,
 `InnoDB_queue_wait_min` float DEFAULT NULL,
 `InnoDB_queue_wait_max` float DEFAULT NULL,
 `InnoDB_queue_wait_pct_95` float DEFAULT NULL,
 `InnoDB_queue_wait_stddev` float DEFAULT NULL,
 `InnoDB_queue_wait_median` float DEFAULT NULL,
 `InnoDB_pages_distinct_min` float DEFAULT NULL,
 `InnoDB_pages_distinct_max` float DEFAULT NULL,
 `InnoDB_pages_distinct_pct_95` float DEFAULT NULL,
 `InnoDB_pages_distinct_stddev` float DEFAULT NULL,
 `InnoDB_pages_distinct_median` float DEFAULT NULL,
 `QC_Hit_cnt` float DEFAULT NULL,
 `QC_Hit_sum` float DEFAULT NULL,
 `Full_scan_cnt` float DEFAULT NULL,
 `Full_scan_sum` float DEFAULT NULL,
 `Full_join_cnt` float DEFAULT NULL,
 `Full_join_sum` float DEFAULT NULL,
 `Tmp_table_cnt` float DEFAULT NULL,
 `Tmp_table_sum` float DEFAULT NULL,
 `Filesort_cnt` float DEFAULT NULL,
 `Filesort_sum` float DEFAULT NULL,
 `Tmp_table_on_disk_cnt` float DEFAULT NULL,
 `Tmp_table_on_disk_sum` float DEFAULT NULL,
 `Filesort_on_disk_cnt` float DEFAULT NULL,
 `Filesort_on_disk_sum` float DEFAULT NULL,
 `Bytes_sum` float DEFAULT NULL,
 `Bytes_min` float DEFAULT NULL,
 `Bytes_max` float DEFAULT NULL,
 `Bytes_pct_95` float DEFAULT NULL,
 `Bytes_stddev` float DEFAULT NULL,
 `Bytes_median` float DEFAULT NULL,
 UNIQUE KEY `hostname_max` (`hostname_max`,`checksum`,`ts_min`,`ts_max`),
 KEY `ts_min` (`ts_min`),
 KEY `checksum` (`checksum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(2)创建数据库账号

$ mysql -uroot -p -h 192.168.1.190 < install.sql
$ mysql -uroot -p -h 192.168.1.190 -e "grant ALL ON slow_query_log.* to 'slowlog'@'%' IDENTIFIED BY '123456';"

(3)配置Query-Digest-UI

修改数据库连接配置

cd Query-Digest-UI
cp config.php.example config.php
vi config.php
$reviewhost = array(
// Replace hostname and database in this setting
// use host=hostname;port=portnum if not the default port
 'dsn'   => 'mysql:host=192.168.1.190;port=3306;dbname=slow_query_log',
 'user'   => 'slowlog',
 'password'  => '123456',
// See http://www.percona.com/doc/percona-toolkit/2.1/pt-query-digest.html#cmdoption-pt-query-digest--review
 'review_table' => 'global_query_review',
// This table is optional. You don't need it, but you lose detailed stats
// Set to a blank string to disable
// See http://www.percona.com/doc/percona-toolkit/2.1/pt-query-digest.html#cmdoption-pt-query-digest--review-history
 'history_table' => 'global_query_review_history',
);

(4)使用pt-query-digest分析日志并将分析结果导入数据库

pt-query-digest --user=slowlog \
--password=123456 \
--review h=192.168.1.190,D=slow_query_log,t=global_query_review \
--review-history h=192.168.1.190,D=slow_query_log,t=global_query_review_history\
--no-report --limit=0% \
--filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\"" \
/usr/local/mysql/data/slow.log

相关文章

  • 对MySQL子查询的简单改写优化

    对MySQL子查询的简单改写优化

    这篇文章主要介绍了对MySQL子查询的简单改写优化,文中的小修改主要将子查询改为关联从而降低查询时关联的次数,需要的朋友可以参考下
    2015-05-05
  • MySQL数据库必备之条件查询语句

    MySQL数据库必备之条件查询语句

    当用户查看表格的大量数据是,由于数据量过于巨大会导致很难获取到需要的数据,在这时,就需要一个方法,一个可以通过用户输入获取到用户需要的数据并回填入表格,这就是条件查询的作用
    2021-10-10
  • CentOS 6、7下mysql 5.7 详细安装教程

    CentOS 6、7下mysql 5.7 详细安装教程

    这篇文章主要为大家介绍了CentOS 6、7下mysql 5.7 详细安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Centos7下MySQL安装教程

    Centos7下MySQL安装教程

    这篇文章主要为大家详细介绍了Centos7下MySQL安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • SQL实现对数据库检索数据的直接转换计算

    SQL实现对数据库检索数据的直接转换计算

    这篇文章主要介绍了SQL实现对数据库检索数据的直接转换计算,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • mysql 字符集的系统变量说明

    mysql 字符集的系统变量说明

    mysql 字符集的系统变量的一些说明,大家在使用过程中,可以作个参考。
    2009-07-07
  • Linux下mysql新建账号及权限设置方法

    Linux下mysql新建账号及权限设置方法

    Linux下mysql新建账号及权限设置方法,其实linux与windows下的设置方法一样的,都是命令行操作
    2012-07-07
  • MySQL数据表的常见约束小结

    MySQL数据表的常见约束小结

    在数据库设计中,约束(Constraints)是用于确保数据的完整性、准确性和一致性的规则,MySQL 提供了多种约束类型,帮助我们规范数据存储,本文给大家介绍了MySQL数据表的常见约束,需要的朋友可以参考下
    2024-12-12
  • Mysql语句快速复习教程(全)

    Mysql语句快速复习教程(全)

    这篇文章主要介绍了Mysql语句快速复习教程(全)的相关资料,需要的朋友可以参考下
    2016-04-04
  • mysql 表空间及索引的查看方法

    mysql 表空间及索引的查看方法

    mysql 表空间及索引的查看方法,需要的朋友可以参考下。
    2011-07-07

最新评论