MySQL经过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含全部执行时间超过long_query_time 秒的SQL语句的日志文件,经过查看这个日志文件定位效率较低的SQL 。mysql
慢查询日志在查询结束之后才记录,因此在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,能够实时地查看SQL 的执行状况,同时对一些锁表操做进行优化。sql
下面咱们举例说明一下,如何经过慢查询日志定位执行效率低的SQL 语句:工具
开启慢查询日志,配置样例:性能
[mysqld] log-slow-queries
在my.cnf 配置文件中增长上述配置项并重启mysql服务,这时mysql慢查询功能生效。慢查询日志将写入参数DATADIR(数据目录)指定的路径下,默认文件名是host_name-slow.log 。测试
和错误日志、查询日志同样,慢查询日志记录的格式也是纯文本,能够被直接读取。下例中演示了慢查询日志的设置和读取过程。优化
首先查询一下 long_query_time 的值 。spa
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 秒而不会出如今慢查询日志中:code
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 瓶颈。
注意:慢查询日志对于咱们发现应用中有性能问题的SQL颇有帮助,建议正常状况下,打开此日志并常常查看分析。