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 |
+---------------------+----------------+
查看慢查询时间,要看 long_query_time。
如下:
mysql> show variables like '%long%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 3.000000 |
+-----------------+----------+
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)
查看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)
建立索引后,查询的时间明显少很多。
mysql> select * from wei where text='banana';
+---------+--------+
| id | text |
+---------+--------+
| 4103519 | banana |
+---------+--------+
mysql> select * from wei where text='banana';
Empty set (0.01 sec)