mysql 通过慢查询日志查写得慢的sql语句

MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL 。

  慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看SQL 的执行情况,同时对一些锁表操作进行优化。

  下面我们举例说明一下,如何通过慢查询日志定位执行效率低的SQL 语句:

  开启慢查询日志,配置样例:

[mysqld] log-slow-queries

  在my.cnf 配置文件中增加上述配置项并重启mysql服务,这时mysql慢查询功能生效。慢查询日志将写入参数DATADIR(数据目录)指定的路径下,默认文件名是host_name-slow.log 。

  和错误日志、查询日志一样,慢查询日志记录的格式也是纯文本,可以被直接读取。下例中演示了慢查询日志的设置和读取过程。

  首先查询一下 long_query_time 的值 。

mysql> show variables like 'long%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | long_query_time | 10 | +-----------------+-------+ 1 row in set (0.00 sec)

  为了方便测试,将修改慢查询时间为5秒。

mysql> set long_query_time=5; Query OK, 0 rows affected (0.02 sec)

  依次执行下面两个查询语句。

  第一个查询因为查询时间低于5 秒而不会出现在慢查询日志中:

mysql> select count(*) from order2008; +----------+ | count(*) | +----------+ | 208 | +----------+ 1 row in set (0.00 sec)

  第二个查询因为查询时间大于5 秒而应该出现在慢查询日志中:

mysql> select count(*) from t_user; +----------+ | count(*) | +----------+ | 6552961 |

  查看慢查询日志。

[root@localhost mysql]# more localhost-slow.log # Time: 081026 19:46:34 # User@Host: root[root] @ localhost [] # Query_time: 11 Lock_time: 0 Rows_sent: 1 Rows_examined: 6552961 select count(*) from t_user;

  从上面日志中,可以发现查询时间超过5 秒的SQL,而小于5秒的则没有出现在此日志中。

  如果慢查询日志中记录内容很多,可以使用mysqldumpslow工具(MySQL客户端安装自带)来对慢查询日志进行分类汇总。下例中对日志文件mysql_master-slow.log进行了分类汇总,只显示汇总后摘要结果:

[root@mysql_master mysql_data]#mysqldumpslow mysql_master-slow.log Reading mysql slow query log from mysql_master-slow.log Count: 2 Time=11.00s (22s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@mysql_master select count(N) from t_user;

  对于 SQL 文本完全一致,只是变量不同的语句,mysqldumpslow 将会自动视为同一个语句进行统计,变量值用N来代替。这个统计结果将大大增加用户阅读慢查询日志的效率,并迅速定位系统的SQL 瓶颈。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

听说你还不会看MySQL慢查询日志?

MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。

911
来自专栏淡定的博客

php之laravel学习常见错误4(连载中)

下面是我们整理的php的laravel学习的常见的错误以及解决的办法,我还会持续更新,请关注

2361
来自专栏GreenLeaves

Oracle 锁机制

本文参考自:ORACLE锁机制 1、oracle是一个多用户使用的共享资源,当多个用户并发的操作同一数据行时,那么在oracle数据库中就会存在多个事务操作统一...

2219
来自专栏Python爬虫实战

MySQL从零开始:03 基本入门语句

在上一小节中介绍了 MySQL 数据库的安装,接下来终于可以动手操作数据库了。本节内容介绍 MySQL 数据库的一些基本操作当做开胃菜。

761
来自专栏抠抠空间

MySQL之库操作

一、库的简介 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等 per...

2755
来自专栏我的博客

PHP读取excel插入mysql数据库

php读取excel在网上找了n多办法,没有合适的。但是也有一定的收获,就是尽量实用类,不用odbc或者csv格式读取——因为它可以跨平台。各自的优缺点在这里都...

3214
来自专栏Java成神之路

Linux_服务器_03_xxx is not in the sudoers file.This incident will be reported.的解决方法

1.切换到root用户下,怎么切换就不用说了吧,不会的自己百度去. 2.添加sudo文件的写权限,命令是: chmod u+w /etc/sudoers 3...

953
来自专栏大白虾谈架构

mysql 远程连接数据库的二种方法

2.6K3
来自专栏IT探索

mysql 事务

a) mysql_autocommit(0); 如果程序在此处coredump,请检查是否connect db

651
来自专栏互联网杂技

mysql命令之对用户,库,表操作--基础教程(三)

创建用户: 进入在root用户进行操作: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; 授权...

34611

扫码关注云+社区