天天看点

MySQL slow query [慢查询] 资料整理

前言:

mysql中提供了一个慢查询的日志记录功能,可以把查询sql语句时间大于多少秒的语句写入慢查询日志,日常维护中可以通过慢查询日志的记录信息快速准确地判断问题所在。

 (有点类似 oracle的v$session_longops )

如下为mysql slow query[慢查询]配置、log文件参数介绍、脚本实现每天以日期格式生成新的log文件等..

<b>1、/etc/my.cnf 配置 slow query  </b>

<b></b>

#开启慢查询

slow_query_log=on   

#超过2秒的查询就视为慢查询

long_query_time=2

#记录日志

slow_query_log_file=/data/mysql/slow.log

<b>2、mysql数据库中查看参数具体值</b>

1)mysql&gt; show variables like '%long_query_time%';

     +-----------------+----------+

     | variable_name   | value    |

     | long_query_time | 2.000000 |  

     +-----------------+----------+  

2) mysql&gt;  show variables like '%slow_query_log%';

     +------------------------------+---------------------------+

     | variable_name                          | value                     |

     | slow_query_log                        | on                        |

     | slow_query_log_file                  | /data/public3306/slow.log |

     +------------------------------+---------------------------+ 

mysql&gt; 

<b>3、slow.log信息解读 及其mysqldumpslow分析简单介绍</b>

1)

slow.log信息解读

# time: 070927  8:08:52

# user@host: root[root] @  [192.168.0.20]

# query_time: 372  lock_time: 136  rows_sent: 152  rows_examined: 263630

select id, name from manager where id in (66,10135);

query_time == 用的时间'秒'

lock_time   ==锁的时间'秒'

rows_sent  ==返回行数

rows_examined==共查询行数

2)

slow log 查看工具mysqldumpslow  

通过mysqldumpslow –help或--help 查看sllow query log 

常用:

-s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有 

c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙 

-t,是top n的意思,即为返回前面多少条的数据 

-g,后边可以写一个正则匹配模式,大小写不敏感的 

mysqldumpslow -s c -t 20 host-slow.log 

mysqldumpslow -s r -t 20 host-slow.log 

上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。 

mysqldumpslow -t 10 -s t -g “left join” host-slow.log 

这个是按照时间返回前10条里面含有左连接的sql语句。

###### 查询慢查询log中超过10s sql的个数(包括重复的sql)..

grep query_time: slow.log |awk '$3&gt;=10{printf("%.f\n",$3)}'|wc -l

<b>4、其他参数设置 </b>

慢查询相关的 参数log_queries_not_using_indexes

如果log_queries_not_using_indexes为on的话,当执行一个sql语句的时候,如果一个表没有索引就会把这个信息记录在慢查询文件中

show variables like "%log_queries_not%" ; 

set global log_queries_not_using_indexes=on;

<b>5、脚本实现slow query每天以日期形式新生成一个log</b>

*** 为了便捷统计每天slow query查询 量和性能问题,特写脚本实现slow query每天以日期形式新生成一个log 

*** 其实就是一个 /usr/bin/mysql -uroot  -n -e "set global slow_query_log_file='/data/mysql/slow_`date +%y_%m_%d`.log';" 

*** 只是直接在crontab 写命令一直不生效,考虑可能是因为"" 双引号原因,所以放在a.sh 提供执行权限 ‘x’即可执行<b>.</b>

<b>具体如下</b> :  

[root@lottery ~]# crontab  -l

0 0 * * * /bin/sh  /root/a.sh

[root@lottery ~]# cat a.sh

 /usr/bin/mysql -uroot  -n -e "set global slow_query_log_file='/data/mysql/slow_`date +%y_%m_%d`.log';"

[root@lottery ~]# 

mysql&gt;  show variables like 'slow_query%log%';

+------------------------------+-------------------------------------+

| variable_name                          | value                                               |

+-------------------------------+-------------------------------------+

| slow_query_log                         | on                                                  |

| slow_query_log_file                   | /data/mysql/slow_2015_05_12.log   |

+-------------------------------+-------------------------------------+ 

mysql&gt; system date +%y_%m_%d

2015_05_12

  【源于本人笔记】 若有书写错误,表达错误,请指正...