【MySQL】——MySQL系列之慢查询

一、前言

      最近在做云平台的mysql数据库,对于mysql的一些常用配置做了梳理,本文单独拿出来mysql的慢查询是因为mysql慢查询比较重要,能快速帮助我们定位mysql慢的原因,特此记录。

     MySQL的慢查询日志是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中(日志可以写入文件或者数据库表,如果对性能要求高的话,建议写文件)。默认情况下,MySQL数据库是不开启慢查询日志的,long_query_time的默认值为10(即10秒,通常设置为1秒),即运行10秒以上的语句是慢查询语句。

二、知识点补充

1、慢查询日志

      某些sql语句执行完毕所花费的时间特别长,我们将这种响应比较慢的语句记录在慢查询日志中,不要被"慢查询日志"的名字误导,错误的以为慢查询日志只会记录执行比较慢的SELECT语句,其实不然,INSERT、DELETE、UPDATE、CALL等DML操作,只要是超过了指定的时间,都可以称之为"慢查询",被记录在慢查询日志中。聪明如你一定已经想到了,"慢查询日志"与"查询日志"的理念很像。默认情况下,慢查询日志是不被开启的,如果需要,可以手动开启,开启慢查询日志之后,默认设置下,执行超过10秒的语句才会被记录到慢查询日志中,当然,对于"慢"的定义,见仁见智,超过多长时间才是我们认为的"慢",可以自定义。

2、慢查询日志的相关参数

log_slow_queries 表示是否开启慢查询日志,5.6以前的版本使用此参数指定是否开启慢查询日志,5.6以后的版本使用slow_query_log取代此参数,如果你使用的mysql版本刚好是5.5,那么你可以看到这两个参数同时存在,此时我们不用同时设置它们,设置这两个参数中的任何一个,另一个也会自动保持一致。

log_output : 表示当慢查询日志开启以后,以哪种方式存放,log_output可以设置为4种值,"FILE"、"TABLE"、"FILE,TABLE"、"NONE"。此值为"FILE"表示慢查询日志存放于指定的文件中,此值为"TABLE"表示慢查询日志存放于mysql库的slow_log表中,此值为"FILE,TABLE"表示将慢查询日志同时存放于指定的文件与slow_log表中,一般不会进行这样的设置,因为这样会徒增很多IO压力,如果开启,建议设置为"table",此值为"NONE"时表示不记录查询日志,即使slow_query_log设置为ON,如果log_output设置为NONE,也不会记录慢查询日志,其实,log_output不止用于控制慢查询日志的输出,查询日志的输出也是由此参数进行控制,也就是说,log_output设置为file,就表示查询日志和慢查询日志都存放到对应的文件中,设置为table,查询日志和慢查询日志就都存放在对应的数据库表中。

slow_query_log 表示是否开启慢查询日志,此参数与log_slow_queries的作用没有区别,5.6以后的版本使用此参数替代log_slow_queries。

slow_query_log_file 当使用文件存储慢查询日志时(log_output设置为"FILE"或者"FILE,TABLE"时),指定慢查询日志存储于哪个日志文件中,默认的慢查询日志文件名为"主机名-slow.log",慢查询日志的位置为datadir参数所对应的目录位置,一般情况下为 /var/lib/mysql

long_query_time :表示"多长时间的查询"被认定为"慢查询",此值得默认值为10秒,表示超过10秒的查询被认定为慢查询。

log_queries_not_using_indexes :表示如果运行的sql语句没有使用到索引,是否也被当做慢查询语句记录到慢查询日志中,OFF表示不记录,ON表示记录。

log_throttle_queries_not_using_indexes :5.6.5版本新引入的参数,当log_queries_not_using_inde设置为ON时,没有使用索引的查询语句也会被当做慢查询语句记录到慢查询日志中,使用log_throttle_queries_not_using_indexes可以限制这种语句每分钟记录到慢查询日志中的次数,因为在生产环境中,有可能有很多没有使用索引的语句,此类语句频繁的被记录到慢查询日志中,可能会导致慢查询日志快速不断的增长,管理员可以通过此参数进行控制。

三、开启慢查询

1.查看慢查询相关参数

mysql> show variables like 'slow_query%';
+---------------------------+----------------------------------+
| Variable_name             | Value                            |
+---------------------------+----------------------------------+
| slow_query_log            | OFF                              |
| slow_query_log_file       | /mysql/data/localhost-slow.log   |
+---------------------------+----------------------------------+

mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

2.设置方法

方法一:全局变量设置
将 slow_query_log 全局变量设置为“ON”状态

mysql> set global slow_query_log='ON'; 

设置慢查询日志存放的位置

mysql> set global slow_query_log_file='/usr/local/mysql/data/slow.log';

查询超过1秒就记录

mysql> set global long_query_time=1;

方法二:配置文件设置
修改配置文件my.cnf,在[mysqld]下的下方加入

[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1

3、验证

1)执行一条慢查询SQL语句

mysql> select sleep(2);

2)查看是否生成慢查询日志

ls /usr/local/mysql/data/slow.log

如果日志存在,MySQL开启慢查询设置成功!

 

四、参考资料

1、https://www.cnblogs.com/gxj521test/p/10964795.html

2、https://www.cnblogs.com/splendid/p/10272951.html

3、http://www.zsythink.net/archives/1260/

你可能感兴趣的:(DataBase)