慢查询日志是MySQL日志功能的一种,记录查询时间大于默认或设置值的SQL语句,也就是记录运行时间超过long_query_time值的SQL(支持写入文件中)。
MySQL数据库的long_query_time默认值的10,即10秒。这个值可由我们自己设置。
默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数。如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询会或多或少带来一定的性能影响。
查看是否开启
show variables like '%slow_query_log%';
![27e068f5c8eabf280e8be40e4ef88543.png](https://i-blog.csdnimg.cn/blog_migrate/ed2180f87797392d4fe798e6ab646b95.jpeg)
slow_query_log值是OFF,即关闭,也是默认值。slow_query_log_file:日志记录所在路径及文件名。
开启命令:
set global slow_query_log=1;
![512245170a33b3639cb7b7e186f874ae.png](https://i-blog.csdnimg.cn/blog_migrate/714290948c70415d0f80ee3dc3af2876.jpeg)
slow_query_log值等于ON,代表已经开启。不过使用此命令开启,重启之后会失效。
这个东西不应该长久生效,若一定要长期开启,可以修改my.cnf配置文件。在[mysqld]下增加参数:slow_query_log和slow_query__log_file,如:
slow_query_log=1 slow_query_log_file=/var/lib/mysql/VM_0_9_centos-slow.log
slow_query_log_file这个值可以缺省,会给默认值:hostname-slow.log,以上就是我本机缺省的值。增加修改参数后重启数据库服务器。
long_query_time
运行时间超过long_query_time值的SQL将会被记录到慢查询日志中,查看long_query_time值:
show variables like '%long_query_time%';
![f0e967b6b5018018ad2ccbdde4560867.png](https://i-blog.csdnimg.cn/blog_migrate/50e98b5e1628679427b0f48e4fc2716e.jpeg)
默认值是10秒,要大于10才会被记录,所以等于也不会。
这个值可用命令修改,也可以在my.cnf中修改。假设超过3秒就认为是慢查询,通过命令可以这样修改:
set global long_query_time = 3;
![2aaf46fc318cffc2fe8658d915b01842.png](https://i-blog.csdnimg.cn/blog_migrate/721b039c1ee91bcd50907a212b56fdc5.jpeg)
修改之后马上查看会发现值还没有改变,此时需要我们重新连接或者打开新的会话。下图就是在新开会话中查看的:
![8b7a3eef2858bd96acb63bddc91b84f0.png](https://i-blog.csdnimg.cn/blog_migrate/199bb20ef0ea6ea465f321dbdb981214.jpeg)
是3秒,没有问题。
现在使用sleep函数模拟一个慢查询,看看效果:
select sleep(4);
![e935d1af453da4e9a90b1478553a9183.png](https://i-blog.csdnimg.cn/blog_migrate/4b30157d185e3434c84d74d3423a4b0c.jpeg)
时间是4秒,查看一下日志文件是否有记录。
可以使用cat命令打印出日志文件内容,也可vi(vim)命令
cat /var/lib/mysql/VM_0_9_centos-slow.log
![3768b4377abdf4a407ac740ed3cb9c29.png](https://i-blog.csdnimg.cn/blog_migrate/744f94378b53f3b929ffaf8a34e903b5.jpeg)
最后一行即刚才模拟的SQL,生产环境我们可以把此SQL拿到,然后结合explain做进一步的分析。
mysqldumpslow
mysqldumpslow是MySQL提供的一个日志分析工具,方便我们在分析日志时候减少一些工作量。而且在生产环境中,我们可以利用工具,根据某些条件得到想要的慢SQL。
mysqldumpslow帮助信息:
mysqldumpslow --help
![a780412fc06313251650409e35ae9469.png](https://i-blog.csdnimg.cn/blog_migrate/3ece4f486ece05124d3f4201077022e8.jpeg)
下面是其中一些选项的意义:
s:是表示按照何种方式排序;c:访问次数l:锁定时间r:返回记录t:查询时间al:平均锁定时间ar:平均返回记录数at:平均查询时间t:即为返回前面多少条的数据;g:后边搭配一个正则匹配模式,大小写不敏感。
我们可以用以上参数进行拼装,然后得到我们想要的慢SQL。如得到访问次数最多的10条SQL:
mysqldumpslow -s c -t 10 /var/lib/mysql/VM_0_9_centos-slow.log
结果形式如下
![1bb8388ccaf5a0334f85053f8f1e5c9a.png](https://i-blog.csdnimg.cn/blog_migrate/6893d1b0f332daf3bfac5f2d959c4c85.jpeg)
这里简单地举一个例子好了,其余的自己可以在工作中多去运用。