您的位置:首页 > 数据库 > MySQL

mysql慢查询日志

2014-12-26 18:09 106 查看
mysql慢查询日志对于分析出代码实现中耗费资源(时间)的sql语句有很高的参考价值。可用于优化程序中的SQL语句。

1.mysql慢查询日志 
打开mysql的慢查询日志很简单,在mysql的配置文件my.cnf里(linux系统)的[mysqld]下面加上

log-slow-queries=mysql_slow.log  日志的文件名

long_query_time=3 
 慢查询时间(这里是3s)

查看慢查询日志是否开启,如果slow_query_log和log_slow_queries显示为on,则慢查询日志已经开启了。
如下:

 mysql> show variables like '%slow%';  
 +---------------------+----------------+  
 | Variable_name       | Value          |  
 +---------------------+----------------+  
 | log_slow_queries    | ON             |  
。。。
 | slow_query_log      | ON             |  
 | slow_query_log_file | mysql_slow.log |  
 +---------------------+----------------+  

4 rows in set (0.00 sec) 

查看慢查询时间,要看 long_query_time。

如下:

mysql> show variables like '%long%';  
+-----------------+----------+  
| Variable_name   | Value    |  
+-----------------+----------+  
| long_query_time | 3.000000 |  
+-----------------+----------+  

1 row in set (0.00 sec)

  2.mysql慢查询日志分析 
 建表如下图,没有给text字段加上索引,只有主键id有索引,数据表填充了4194304条数据。

mysql>desc test;



mysql>show index from test;



我们来执行一个慢查询(这里是超过3s),如下:

 mysql> select * from wei where text='apple';  
 +---------+--------+  
 | id      | text   |  
 +---------+--------+  
 | 4103519 | orange |  

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

1 row in set (3.79 sec) 
再执行一个慢查询的和一个较快的查询的:

mysql> select * from wei where text='banana';  
Empty set (3.82 sec)  

[mysql> select * from wei where id=4567;  
+------+--------------------+  
| id   | text               |  
+------+--------------------+  
| 4567 | 111111111111111111 |  
+------+--------------------+  
1 row in set (0.02 sec)  

可以通过下面的命令查看现在这个session有多少个慢查询:



查看mysql_slow.log,内容包括 1)查询语句 2)花费的时间 3)查询时的时间戳 4)检查的行数Rows_examined

# Time: 121017 17:38:54 

# User@Host: root[root] @ localhost [127.0.0.1] 

# Query_time:3.794217 Lock_time: 0.000000 Rows_sent: 1  Rows_examined:4194304 

SET timestamp=1350466734; 
select* from wei where text='apple'; 

# Time: 121017 17:46:22 

# User@Host: root[root] @ localhost [127.0.0.1] 

# Query_time:3.819219 Lock_time: 0.000000 Rows_sent: 0  Rows_examined:4194304 

SET timestamp=1350467182; 
select* from wei where text='banana'; 

3.优化 

定位到了慢查询语句后,执行explain或者desc命令查看该慢查询语句的具体信息,如下图:

mysql>desc select * form test where text='banana'



建索引如下:

mysql> create index text_index on test(text);  
Query OK, 4194304 rows affected (1 min 58.07 sec)  

Records: 4194304  Duplicates: 0  Warnings: 0 

建立索引后,查询的时间明显少很多。

 mysql> select * from wei where text='banana';  
 +---------+--------+  
 | id      | text   |  
 +---------+--------+  
 | 4103519 | banana |  
 +---------+--------+  

1 row in set (0.33 sec)

 mysql> select * from wei where text='banana';  
 Empty set (0.01 sec)  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: