MYSQL定位慢查询

时间:2022-09-18 09:42:43

定位慢查询

在web开发中,我们经常会写出一些SQL语句,一条糟糕的SQL语句可能让你的整个程序都非常慢,超过10秒一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间比较长的SQL语句找出呢?MySQL给我们提供了一个很好的功能,那就是慢查询!所谓的慢查询就是通过设置来记录超过一定时间的SQL语句!那么如何应用慢查询呢?

 

开启MySQL的慢查询日志功能
默认情况下,MySQL是不会记录超过一定执行时间的SQL语句的。要开启这个功能,我们需要修改MySQL的配置文件,windows下修改my.ini,Linux下修改my.cnf文件,在[mysqld]最后增加如下命令:

slow_query_log= 1

long_query_time= 1

slow_query_log_file=c:/slow.log

 

解释:

slow_query_log= 1,表示开启慢查询日志功能,当然slow_query_log= 0就是关闭了(默认情况),要开启也可以直接这样写slow_query_log。

long_query_time =1,表示设置慢查询的时间为1S,默认为10S,即如果有查询超过了这个时间,将会被记录到慢查询日志中。当然在高版本的MYSQL中这个时间还可以设置成小数。

slow_query_log_file=c:/slow.log,表示慢查询日志存放的目录文件。当然这条可以不写,不写时,默认在mysql的data目录下生成“主机名_slow.log”的文件来存放日志。

测试

1、在my.ini中加入以下配置,并重启动MYSQL服务

slow_query_log = 1

ong_query_time = 1

2、在MYSQL控制如输入命令select sleep(2)

mysql> select sleep(2);

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

| sleep(2) |

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

|        0|

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

1 row in set (2.00 sec)

3、再查看日志文件,会看到以下信息。

# Time: 141014 14:28:52

# User@Host: root[root] @ localhost[::1]  Id:     1

# Query_time: 2.000114  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0

SET timestamp=1413268132;

select sleep(2);

 

附录

另外,我们还要了解解一些MYSQL数据库查看状态的命令,以便更详尽的掌控MYSQL。在控制如下执行这些命令查看mysql数据库一些运行的状态。

show [session|global]status 注:不写默认的为session..session只取出当前会话的状态,global会取出从启动到现在的状态。

showstatus   查看数据库状态,这里面的状态有很多,DBA应该了解大多数。

showstatus like ‘uptime’    数据库启动时间(S)

showstatus like ‘com_select’    数据库执行了多少次查询

showstatus like ‘com_update’   数据库执行了多少次更新

showstatus like ‘com_delete’    数据库执行了多少次删除

showstatus like ‘com_insert’     数据库执行了多少次插入

showstatus like 'connections'   试图链接MYSQL数据库的次数;另外可用cmd下的netstat –an 查看是那些IP链接到3306上,即链接到MYSQL数据库上。

show status like 'slow_queries';             慢查询次数。默认情况下,超过10S的为慢查询。

 

控制台下修改MYSQL默认的慢查询时间

show variableslike 'long_query_time' 查询默认的慢查询时间

set long_query_time = 1    设置默认的慢查询时间