mysql 慢查询日志

helei 2021-6-19 901 6/19

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10 s以上的语句。在默认情况下,MySQL数据库并不启动慢查询日志,需要手动设置该参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少对性能带来一定的影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。慢查询主要体现在慢上,通常意义上来讲,只要返回时间大于1 s的查询都可以称为慢查询。慢查询会导致CPU、内存消耗过高,数据库服务器压力陡然增大,对于大部分情况来讲,基本都是由某些慢查询导致的。

慢查询日志中不止包含了执行时间过长的语句(大于设置的long_query_time阈值),还包含了未使用索引或者未使用最优的索引,这两种日志默认都是没有打开的。未使用索引的日志内容一般来讲会有很多,导致日志文件非常大,通常不记录这种日志或者限制其每分钟输出的日志数量(设置遍历log_throttle_queries_not_using_indexes控制)。

(1)MySQL慢查询相关参数详细解释如下。

slow_query_log 是否开启慢查询日志,1表示开启,0表示关闭。

log-slow-queries 旧版(5.6以下版本)MySQL数据库慢查询日志存储路径,可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log。

slow-query-log-file 新版(5.6及以上版本)MySQL数据库慢查询日志存储路径,可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log。

long_query_time 慢查询阈值,当查询时间多于设定的阈值时,记录日志。

log_queries_not_using_indexes 未使用索引的查询也被记录到慢查询日志中(可选项)。

log_output 日志存储方式,log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入mysql.slow_log表中。MySQL数据库支持两种日志同时存储的方式,配置的时候以逗号隔开即可,如log_output='FILE,TABLE'。日志记录到系统的专用日志表中要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,建议将日志优先记录到文件。

(2)可以通过以下两种方法开启慢日志查询,第一种是通过命令开启慢查询,这样只是对当前数据库生效,如果MySQL重启之后则会失效。如果要永久生效就需要修改配置文件,相关命令如下:

Show variables like "%long%";  #查看默认为慢查询的时间

set global long_query_time=2;  #设置慢查询时间阈值为2 s

show variables like "%slow%";  #查看一下慢查询是不是已经开启

Set global slow_query_log="ON"; #启用慢查询

第二种是修改mysql里面my.ini中的内容,在其中加上以下内容并重启mysql生效:

long_query_time = 2

log-slow-queries = /usr/local/mysql/mysql-slow.log

(3)关于慢查询日志的内容,给出如下一个样例:

# Time: 180102 15:00:23

# User@Host: user[user] @ [192.168.0.3] id : 2035608

# Query_time: 6.977880 Lock_time: 0.000056 Rows_sent: 2 Rows_examined: 3961943

SET timestamp=1514876423

SELECT colume1, colume2, COUNT(1)

FROM db.table

WHERE colume1=’20180102’ AND colume2= ‘x’

GROUP BY colume1, colume2;

第一行标记了日志产生的时间,也就是SQL执行完成的时间。第二行为客户端的信息(第一个是授权账户,第二个是登录账户)、客户端的ip地址及mysqlld的线程ID。第三行包含了查询执行的信息,包含了查询时长、锁持有时长、返回客户端的行数、扫描的行数,最后是时间戳及产生这个慢查询的SQL语句。

(4)慢查询日志内容较多,在实际的生产环节中,手工查找分析SQL既耗费时间,又耗费人力,一般使用MySQL提供的日志分析工具mysqldumpslow进行日志分析。相关慢查询日志分析工具还有开源的mysqlsla,percona-toolkit中包含的pt-query-digest工具也可以分析汇总慢查询的信息。

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

mysqldumpslow -s r -t 10 /database/mysql/slow.log

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

mysqldumpslow -s c -t 10 /database/mysql/slow.log

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

mysqldumpslow -s t -t 10 -g “left join” slow.log

(5)根据慢查询查看执行计划。在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还没有结束,我们还需要知道该SQL的执行计划,如全表扫描还是索引扫描,这些都需要通过EXPLAIN命令去完成。

EXPLAIN命令是查看优化器如何决定执行查询的主要方法,可以帮助我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用(详见6.3.2节)。

- THE END -

helei

6月19日19:57

最后修改:2021年6月19日
0

非特殊说明,本博所有文章均为博主原创。