mysql下的iop是,Mysql管理必备工具Maatkit详解之十二(mk-query-digest)

mk-query-digest 一个功能很强大的工具,能分析慢查询日志,也可以对当前的语句进行分析等。安装方法查看这里。

一、分析慢查询日志,生成报表

mysql通过log-slow-queries和long_query_time参数来记录慢查询,默认的格式如下:

# Time: 090909 4:34:28

# User@Host: sparty[sparty] @ [localhost]

# Query_time: 18 Lock_time: 0 Rows_sent: 5 Rows_examined: 52830

select * from test;

# Time: 090909 14:04:24

# User@Host: sparty[sparty] @ [localhost]

# Query_time: 20 Lock_time: 0 Rows_sent: 10 Rows_examined: 2500284

select * from test2;

每产生一条慢查询记录一行,分析起来不直观,也无法进行统计。mk-query-digest能对slow log进行了统计和分析产生报告,可以更具自己的需要,分析出想要的结果。例如

mk-query-digest --limit 2 --select Query_time,Lock_time,Rows_sent,Rows_examined,ts slow.log \

|grep -v '1us' |grep -v '10us'|grep -v '1ms'|grep -v '10ms'|grep -v '100ms' \

|grep -v '1s'|grep -v '10s'|grep -v 'SHOW'|grep -v '100us'|grep -v 'EXPLAIN'

# Overall: 3 total, 2 unique, 0.00 QPS, 0.00x concurrency ________________

# total min max avg 95% stddev median

# Exec time 78s 8s 44s 26s 42s 14s 25s

# Lock time 2ms 0 2ms 588us 2ms 822us 0

# Rows sent 23.87M 1 11.93M 7.96M 11.87M 5.59M 11.87M

# Rows exam 35.80M 11.93M 11.93M 11.93M 11.87M 0 11.87M

# Time range 2009-05-20 20:33:59 to 2009-05-27 14:50:13

# Query 1: 0.08 QPS, 2.68x concurrency, ID 0x67A347A2812914DF at byte 1240

# This item is included in the report because it matches --limit.

# pct total min max avg 95% stddev median

# Count 66 2

# Exec time 89 70s 26s 44s 35s 44s 13s 35s

# Lock time 0 0 0 0 0 0 0 0

# Rows sent 99 23.87M 11.93M 11.93M 11.93M 11.93M 0.71 11.93M

# Rows exam 66 23.87M 11.93M 11.93M 11.93M 11.93M 0.71 11.93M

# Time range 2009-05-27 14:49:47 to 2009-05-27 14:50:13

# Query_time distribution

# Tables

SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`\G

# Query 2: 0 QPS, 0x concurrency, ID 0x92203A59492D2ECF at byte 0 ________

# This item is included in the report because it matches --limit.

# pct total min max avg 95% stddev median

# Count 33 1

# Exec time 10 8s 8s 8s 8s 8s 0 8s

# Lock time 100 2ms 2ms 2ms 2ms 2ms 0 2ms

# Rows sent 0 1 1 1 1 1 0 1

# Rows exam 33 11.93M 11.93M 11.93M 11.93M 11.93M 0 11.93M

# Time range 2009-05-20 20:33:59 to 2009-05-20 20:33:59

# Query_time distribution

# Tables

select count(*) from test where t1=20 and t2=100\G

# Rank Query ID Response time Calls R/Call Item

# ==== ================== ================ ======= ========== ====

# 1 0x67A347A2812914DF 69.7409 89.4% 2 34.870474 SELECT test

# 2 0x92203A59492D2ECF 8.2742 10.6% 1 8.274248 SELECT test

报表的输出分三部分,开头部分是整个报表的综合统计。中间部分把单独的Query进行统计,按照total Exec time从高到低排序。结尾部分是输出的每条Query的一些统计。

解释一下主要参数:

-limit 指输出耗时最多的Query的条数限制。

-select 选择需要统计的指标。

二、对当前的查询进行统计分析

mk-query-digest也能使用–processlist参数,对指定mysql的当前Query进行统计分析,例如

mk-query-digest –processlist h=localhost -u sg -p

然后在CTRL+C结束,将对这段时间h=localhost里所进行的所有Query进行统计分析并生成报表,报表的输出和上面介绍的一样。

三、分析慢查询日志,将结果导入到指定表。

mk-query-digest也能使用–review参数,将慢查询日志的分析结果插入到指定表中。

首先需要创建表,存放分析结果:

CREATE TABLE query_review (

checksum BIGINT UNSIGNED NOT NULL PRIMARY KEY,

fingerprint TEXT NOT NULL,

sample TEXT NOT NULL,

first_seen DATETIME,

last_seen DATETIME,

reviewed_by VARCHAR(20),

reviewed_on DATETIME,

comments TEXT

)

COLUMN MEANING

=========== ===============

checksum A 64-bit checksum of the query fingerprint

fingerprint The abstracted version of the query; its primary key

sample The query text of a sample of the class of queries

first_seen The smallest timestamp of this class of queries

last_seen The largest timestamp of this class of queries

reviewed_by Initially NULL; if set, query is skipped thereafter

reviewed_on Initially NULL; not assigned any special meaning

comments Initially NULL; not assigned any special meaning例如:

mk-query-digest --review h=host1,D=test,t=query_review /path/to/slow.log

mysql> use test;

Database changed

mysql> select * from query_review\G;

*************************** 1. row ***************************

checksum: 7467891370387641567

fingerprint: mysqldump

sample: SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`

first_seen: 2009-05-27 14:49:47

last_seen: 2009-05-27 14:50:13

reviewed_by: NULL

reviewed_on: NULL

comments: NULL

*************************** 2. row ***************************

checksum: 10529480083946417871

fingerprint: select count(*) from test where test1=? and test2=?

sample: select count(*) from test where test1=20 and test2=100

first_seen: 2009-05-20 20:33:59

last_seen: 2009-05-20 20:33:59

reviewed_by: NULL

reviewed_on: NULL

comments: NULL

2 rows in set (0.00 sec)

四、查找未走索引的语句

mk-query-digest还可以用来找出当前数据库未走索引的语句,例如我使用下面命令:

tcpdump -i bond0 port 3306 -s 65535 -x -n -q -tttt | mk-query-digest –type tcpdump –filter '($event->{No_index_used} || $event->{No_good_index_used})'

然后在CTRL+C结束,将生成下面的报告。

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes

3 packets captured

3 packets received by filter

0 packets dropped by kernel

# Caught SIGINT.

# 170ms user time, 20ms system time, 12.00M rss, 73.26M vsz

# Overall: 1 total, 1 unique, 0 QPS, 0x concurrency ______________________

# total min max avg 95% stddev median

# Exec time 223us 223us 223us 223us 223us 0 223us

# Time range 2009-09-16 09:22:50.637146 to 2009-09-16 09:22:50.637146

# bytes 26 26 26 26 26 0 26

# Rows affe 0 0 0 0 0 0 0

# Warning c 0 0 0 0 0 0 0

# 100% (1) No_index_used

# Query 1: 0 QPS, 0x concurrency, ID 0x3D8C074C26D05CD7 at byte 0 ________

# This item is included in the report because it matches --limit.

# pct total min max avg 95% stddev median

# Count 100 1

# Exec time 100 223us 223us 223us 223us 223us 0 223us

# Hosts 1 10.0.0.203

# Time range 2009-09-16 09:22:50.637146 to 2009-09-16 09:22:50.637146

# bytes 100 26 26 26 26 26 0 26

# Errors 1 none

# Rows affe 0 0 0 0 0 0 0 0

# Warning c 0 0 0 0 0 0 0 0

# 100% (1) No_index_used

select * from test\G

# Rank Query ID Response time Calls R/Call Item

# ==== ================== ================ ======= ========== ====

# 1 0x3D8C074C26D05CD7 0.0002 100.0% 1 0.000223 SELECT test

很明显,使用tcpdump只能对本地的mysql进行监听,一目了然的找到了哪条sql是没走索引的。

最后,我们在看下这个工具的帮助选项:

原文来自:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值