慢查询的疑问及应用

问题提出:你工作的时候,老板可能会问你,我的数据库系统跑了一年了,系统查询数据变慢了,怎么进行优化?那你肯定说建立索引优化就搞定了, 那是不是所有的SQL都有问题呢?当然不是,我要对特定的SQL语句进行有针对的优化,找出查询最慢的,找出查询次数最多的,我统计出来,然后进行有针对性的进行优化。那怎么办呢?我们就需要用到慢查询日志这个工具了。下面详细说一下慢查询到底怎么用。

在公司中一般普通的开发程序员是接触不到这些的,因为没有权限去操作数据库,一般交给运维人员来做,一般是让运维人员打开慢查询日志。截取一天的数据,或者是一段时间的查询数据,具体找出查询最慢的,找出查询次数最多的SQL语句进行优势。

慢查询是什么

  • MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
  • 具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。
  • 由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql,结合explain进行全面分析。
    (注意:慢查询日志不是一直开着的,开启慢查询日志后,但凡发生sql慢了,都要写到日志里面,写日志会发生IO,进而使系统会变的更慢。)

慢查询日志怎么用

默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数。
当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件

查看是否开启慢查询日志

查看慢查询是否开启

SHOW VARIABLES LIKE '%slow_query_log%';

在这里插入图片描述在这里插入图片描述
默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,

可以通过设置slow_query_log的值来开启
使用

set global slow_query_log=1;

开启了慢查询日志只对当前数据库生效,
在这里插入图片描述

如果MySQL重启后则会失效。

什么样的sql会被记录到慢查询日志中

SHOW VARIABLES LIKE '%slow_query_log%';

在这里插入图片描述

这个是由参数long_query_time控制,默认情况下long_query_time的值为10秒,意思就是超过十秒的查询才会被记录到慢查询日志中。这个时间太长了,我们需要修改默认值。

可以使用命令修改,也可以在my.cnf参数里面修改。

假如运行时间正好等于long_query_time的情况,并不会被记录下来。也就是说,
在mysql源码里是判断大于long_query_time,而非大于等于。

设置阈值为0.1s

set long_query_time=0.1

在这里插入图片描述
没有加global只是在当前窗口有效,一旦重新连接数据库就失效了

set global long_query_time=0.1

加global,MySQL重启后则会失效。

SHOW VARIABLES LIKE '%slow_query_log%';

在这里插入图片描述
运行几条sql语句,打开/var/lib/mysql/cocoon-slow.log查看慢查询日志
在这里插入图片描述
在这里插入图片描述
查询当前系统中有多少条慢查询记录。

show global status like '%Slow_queries%';

在这里插入图片描述

日志分析工具mysqldumpslow

在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow。

mysqldumpslow --help

在这里插入图片描述
在这里插入图片描述

#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
 
#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
 
#得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
 
#另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

猜你喜欢

转载自blog.csdn.net/qq_43925089/article/details/109436007