MySQL慢查询

MySQL慢查询定义

分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”,也包括了INSERT、DELETE、UPDATE、CALL等DML操作。

MySQL慢查询的体现

慢查询主要体现在慢上,通常意义上来讲,只要返回时间大于 >1 sec上的查询都可以称为慢查询。慢查询会导致CPU,内存消耗过高。数据库服务器压力陡然过大。

MySQL慢查询参数设置

1. 查看配置情况:

show variables like %query%;
  • 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:慢查询开关 on表示开 off表示关闭

  • slow_query_log_file :慢查询日志存储位置

  • long_query_time:查看慢查询时间,默认10s,建议降到1s或以下,超过这个查询时间会被记录下来

  • 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可以限制这种语句每分钟记录到慢查询日志中的次数,因为在生产环境中,有可能有很多没有使用索引的语句,此类语句频繁的被记录到慢查询日志中,可能会导致慢查询日志快速不断的增长,管理员可以通过此参数进行控制。

2.开启慢查询

方法一:在服务器上找到mysql的配置文件my.cnf , 然后再mysqld模块里追加以下内容,重启MySQL即可。

#慢查询开关

slow_query_log = ON

#定义慢查询日志的路径

slow_query_log_file = /tmp/slow_querys.log

#定义查过多少秒的查询算是慢查询,我这里定义的是1秒,5.6之后允许设置少于1秒,例如0.1秒

long_query_time = 1

#用来设置是否记录没有使用索引的查询到慢查询记录,默认关闭,看需求开启,会产生很多日志,可动态修改

#log-queries-not-using-indexes

管理指令也会被记录到慢查询。比如OPTIMEZE TABLE, ALTER TABLE,默认关闭,看需求开启,会产生很多日志,可动态修改

#log-slow-admin-statements

方法二:命令

#开启慢查询功能,1是开启,0是关闭

mysql> set global slow_query_log=1;

#定义查过多少秒的查询算是慢查询,我这里定义的是1秒,5.6之后允许设置少于1秒,例如0.1秒

mysql> set global long_query_time=1;

#定义慢查询日志的路径

mysql> set global slow_query_log_file=‘/tmp/slow_querys.log‘;

#关闭功能:

set global slow_query_log=0;

然后通过一下命令查看是否成功

mysql> show variables like ‘long%‘; mysql> show variables like ‘slow%‘;

#设置慢查询记录到表中

#set global log_output=‘TABLE‘;

MySQL慢查询日志的记录定义

上面配置了慢查询时间为1秒,超过1秒的查询会被记录下来

select sleep(2);

使用MySQL中执行select sleep(N)可以让此语句运行N秒钟,方便得出结论,日志记录如下:

Time: 2021-01-11T15:12:37.488818Z

User@Host: root[root] @ localhost [127.0.0.1] Id: 2

Query_time: 2.006118 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0

SET timestamp=1610377957; /* ApplicationName=DataGrip 2020.3 */ select sleep(2);

  • 第一行,SQL查询执行的时间

  • 第二行,执行SQL查询的连接信息,用户和连接IP

  • 第三行,记录了一些我们比较有用的信息,如下解析:

    • Query_time,这条SQL执行的时间

    • Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间

    • Rows_sent,查询返回的行数

    • Rows_examined,查询检查的行数

    • timestamp,时间戳,只是和第一行对应执行时间。

    • 执行的sql语句记录信息

MySQL慢查询日志分析方法

MySQL程序自带mysqldumpslow命令

mysqldumpslow只能作用于慢查询日志文件,当log_output的值设置为"TABLE",不会帮我们统计slow_log表

-s, 是表示按照何种方式排序

c: 访问计数 l: 锁定时间

r: 返回记录

t: 查询时间

al:平均锁定时间

ar:平均返回记录数

at:平均查询时间

-t, 是top n的意思,即为返回前面多少条的数据;

-g, 后边可以写一个正则匹配模式,大小写不敏感;

基本用法

例:

得到返回记录集最多的10个SQL:

mysqldumpslow -s r -t 10

得到访问次数最多的10个SQL:

mysqldumpslow -s c -t 10

得到按照时间排序的前10条里面含有左连接的查询语句:

mysqldumpslow -s t -t 10 -g “left join”

MySQL慢查询

上一篇:读取Oracle数据写入TXT


下一篇:Java数组的复制全解