java捕获慢查询_慢查询 · JAVA · 看云

[TOC]

# 简介

默认情况,mysql没有开启慢查询日志,需要手动来开启.

查询是否开启

~~~

show variables like '%slow_query_log%';

~~~

开启下

修改my.cnf文件,增加或修改参数`slow_query_log` 和`slow_query_log_file`后,然后重启MySQL服务器,如下所示

~~~

slow_query_log =1

slow_query_log_file=/tmp/mysql_slow.log

~~~

关于慢查询的参数`slow_query_log_file` ,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件`host_name-slow.log`(如果没有指定参数`slow_query_log_file`的话)

---

~~~

select sleep(3);

~~~

那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢? 这个是由参数`long_query_time`控制,默认情况下`long_query_time`的值为10秒,可以使用命令修改,也可以在my.cnf参数里面修改。关于运行时间正好等于`long_query_time`的情况,并不会被记录下来。也就是说,在mysql源码里是判断大于`long_query_time`,而非大于等于。从MySQL 5.1开始,`long_query_time`开始以微秒记录SQL语句运行时间,之前仅用秒为单位记录。如果记录到表里面,只会记录整数部分,不会记录微秒部分。

---

系统变量`log-queries-not-using-indexes`:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用`full index scan`的sql也会被记录到慢查询日志。

~~~

mysql> show variables like 'log_queries_not_using_indexes';

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

| Variable_name | Value |

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

| log_queries_not_using_indexes | OFF |

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

1 row in set (0.00 sec)

mysql> set global log_queries_not_using_indexes=1;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'log_queries_not_using_indexes';

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

| Variable_name | Value |

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

| log_queries_not_using_indexes | ON |

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

1 row in set (0.00 sec)

~~~

系统变量`log_slow_admin_statements`表示是否将慢管理语句例如`ANALYZE TABLE`和`ALTER TABLE`等记入慢查询日志

~~~

mysql> show variables like 'log_slow_admin_statements';

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

| Variable_name | Value |

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

| log_slow_admin_statements | OFF |

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

1 row in set (0.00 sec)

~~~

查询有多少条慢查询记录,可以使用系统变量。

~~~

mysql> show global status like '%Slow_queries%';

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

| Variable_name | Value |

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

| Slow_queries | 2104 |

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

1 row in set (0.00 sec)

~~~

# mysql配置

在`[mysqld]`下配置

~~~

slow_query_log =1

slow_query_log_file=/tmp/mysql_slow.log

long_query_time=3

log_output=FILE

~~~

`log_output`参数是指定日志的存储方式。`log_output='FILE'`表示将日志存入文件,默认值是'FILE'。

`log_output='TABLE'`表示将日志存入数据库,这样日志信息就会被写入到`mysql.slow_log`表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:`log_output='FILE,TABLE'`。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。

# 日志分析工具

~~~

mysqldumpslow [参数] [日志文件]

~~~

**参数**

~~~

s: 是表示按照何种方式排序

c: 访问计数

l: 锁定时间

r: 返回记录

t: 查询时间

al:平均锁定时间

ar:平均返回记录数

at:平均查询时间

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

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

~~~

**例子**

得到返回记录集最多的10个SQL

~~~

mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

~~~

得到访问次数最多的10个SQL

~~~

mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

~~~

得到按照时间排序的前10条里面含有左连接的查询语句

~~~

mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

~~~

另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现刷屏的情况

~~~

mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more

~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值