mysql慢查询和php-fpm慢日志

MySQL慢查询

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

PHP-FPM慢日志

php-fpm慢日志slowlog设置可以让开发者很好的查找哪些php进程速度过慢而导致的网站问题,让开发者方便的找到问题的所在。该方法同样适用于排查nginx的500、502问题根源,当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。

MySQL慢查询的不足

  • MySQL5.0版本, long_query_time时间粒度不够细,最小值为1秒。对于高并发性能的网页脚本而言,1秒出现的意义不大。即出现1秒的查询比较少。直到mysql5.1.21才提供更细粒度的long_query_time设定.

  • 不能将服务器执行的所有查询记录到慢速日志中。虽然MySQL普通日志记录了所有查询,但是它们是解析查询之前就记录下来了。这意味着普通日志没办法包含诸如执行时间,锁表时间,检查行数等信息。

  • 如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。

1、如何开启慢查询?  

首先我们先查看MYSQL服务器的慢查询状态是否开启.

mysql>show variables like '%quer%';

    
开启慢查询非常简单, 操作如下:

方法一

vi  /etc/my.cnf       注:my.cnf是mysql的配置文件

      
在mysqld下方加入慢查询的配置语句(一定要在[mysqld]的下方加入)

[mysqld]

    log-slow-queries = /var/lib/mysql/mysql-slow.log

    long_query_time = 1

保存退出   重启mysql

log-slow-queries : 代表MYSQL慢查询的日志存储目录, 此目录文件一定要有写权限。

long_query_time: sql最长执行时间。

方法二

在mysql命令行下执行如下操作:

set global slow_query_log=ON;

未分类

set global long_query_time=1;

未分类

测试

1、查看生成的慢日志记录 此时是空的没有记录

cat mysql-slow.log 

未分类
        
2、执行一条超过设置时间的sql语句 在查看是否被记录

如:select sleep(1); 再去查看慢日子记录

未分类

到此mysql慢查询就OK了。

2、 如何开启php-fpm慢日志?

php-fpm.conf的配置文件中有一个参数request_slowlog_timeout是这样描述的:

未分类 

当request_slowlog_timeout 设为一个具体秒时request_slowlog_timeout =5,表示如果哪个脚本执行时间大于5秒,会记录这个脚本到慢日志文件中

request_slowlog_timeout =0表示关闭慢日志输出。

慢日志文件位置默认在php的安装目录下的log文件夹中,可以通过修改slowlog = log/$pool.log.slow参数来指定。

php-fpm慢日志的例子,慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长。

request_slowlog_timeout 和 slowlog需要同时设置,开启request_slowlog_timeout的同时需要开启 slowlog

慢日志路径需要手动创建 (slowlog)

具体开启步骤如下:

未分类

结束。