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 |

查看慢查询日志。

[[email protected] mysql]# more localhost-slow.log   # Time: 081026 19:46:34   # [email protected]: 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进行了分类汇总,只显示汇总后摘要结果:

[[email protected]_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 瓶颈。

注意:慢查询日志对于我们发现应用中有性能问题的SQL很有帮助,建议正常情况下,打开此日志并经常查看分析。

时间: 2024-08-27 02:55:23

MySQL优化:使用慢查询日志定位效率较低的SQL语句的相关文章

[MySQL优化] -- 如何定位效率较低的SQL

一般通过以下两种方式定位执行效率较低的 SQL 语句. 通过慢查询日志定位那些执行效率较低的 SQL 语句,用 --log-slow-queries[=file_name] 选项启动时, mysqld 会 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件,通过查看这个日志文件定位效率较低的 SQL . 慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用 show processlist 命令查看当前

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

MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL . 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态.是否锁表等,可以实时地查看SQ

Mysql 定位执行效率低的sql 语句

一.通过MySQL慢查询日志定位执行效率低的SQL语句. MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL . 1.通过命令: show variables like '%query%'  查看是否开启慢查询日志. 开启前 开启后 slow_query_log :   on

sqlserver查询所有表的行数的sql语句

原文:sqlserver查询所有表的行数的sql语句 select a.name, b.rows  from sysobjects a inner join sysindexes b on a.id = b.id where a.type = 'u'   and b.indid in (0, 1)order by a.name

mysql性能优化之慢查询日志分析

打开慢查询日志在my.cnf置文件中修改log-slow-queries = 日志文件路径 (注:log-slow-queries在未来的版本将被删除,尽量使用slow-query-log-file 重启服务后会出现warning警告 [Warning] The syntax '--log-slow-queries' is deprecated and will be removed in a future release. Please use '--slow-query-log'/'--sl

mysql中的慢查询日志

首先我们看一下关于mysql中的日志,主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客 户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. 先看一下日志参数 mysql> show variables like '%log%'; +-----------------

MySQL 5.7 启用查询日志

MySQL版本:5.7 新版本的 my.ini 文件改动了,导致原先启用查询日志的方法不再适用 新版本的启用方法如下: 1. 修改 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini 文件  搜索 # General and Slow logging.  将以下几行改动为: # General and Slow logging. log-output=FILE general-log=1 general_log_file="D:/Develop/MySQL/

Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解

Mysql慢查询开启 Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应时间超过阈值的语句,具体指运行时间超过long_query_time值得SQL,则会被记录到慢查询日志中.long_query_time的默认为10,意识是运行10秒以上的语句.由它来看那些SQL语句超出了我们的最大忍耐值,比如一条SQL执行超过了5秒,我们就算慢查询,我们就可以结合Explain进行分析.默认Mysql没有开启慢查询,需要我们说动设置这个参数.当然,如果不是调优需要的话,一般

【Mysql】求出离最近相差X天的项,sql语句关于日期的比对

对于一张如下的testtable表,如果要查询date离现在相差的30年的日期 则应该使用如下的sql语句: select * from testtable where timestampdiff(year,date,now())<30 这种方法,即使date这个字段是varchar类型也是可以查询成功的. timestampdiff函数中,第一个字段是单位,可以改成second,day,month等 而如下的查询方法,考虑到1985离现在相差30年,虽然简单,但是如果日期的变更,比如明年,这条