MySQL抛出查询日志提供了超过指定时间阈值的查询信息,为性能优化提供了主要参考依据,是一项非常实用的功能。
Mysql抛出查询日志的打开和配置非常简单,可以指定要记录的文件(或表),超过的时间阈值等可以记录在抛出SQL中。
老实说,与sqlserver跟踪或扩展事件相比,MySQL的配置总是非常清晰。
1 .打开滚动查询日志
通常,只需将slow_query_log=1配置文件添加到配置文件中。 也就是说,如果打开了滚动查询日志,但未指定slow_query_log_file,则会自动生成主机名为“‘slow'.log的文件。
show VARIABLES like '%slow_query% '
slow_query_log ON
sow _ query _ log _ filed 3360/PHP/wamp/sfdz/MySQL/MySQL5.6. 17/data/localhost-slow.log
慢速日志条目命令设置
设置全局slow _ query _ log=' on ';
2、默认情况下,记录慢速查询的时间阈值为10s
showvariableslike ' % long _ query _ time % '
默认情况下,在使用slow_query_log=1启动MySQL时,将打开一个具有主机名“‘slow'.log的默认文件,并记录超过10s的滚动查询
也可以显式指定低速查询的日志文件名(如果不存在,将自动创建)和记录低速查询的时间阈值)。 不是默认的10s。
修改的抛出日志超过了时间
设置全局long _ query _ time=1;
注意如果在配置文件中指定long_query_time,则不需要时间单位。 只需要一个值。 例如,1表示1s。 如果拥有时间单位,则无法启动服务。
是否打开未使用mysql索引的语句
set全局log _ queries _ not _ using _ indexes=on; 默认值为off
以下是记录在日志文件中的低速sql的示例
3、在表中记录低速查询日志
配置:要在表中记录慢速查询,必须添加log_output的配置
可以在window mysql.ini、liunx上设置为mysql.cnf
1、Windows上的MySQL配置文件为my.ini,通常位于安装目录的根目录中。
2、MySQL在Linux上的配置文件为my.cnf,一般放在/etc/my.cnf、/etc/mysql/my.cnf。 如果找不到,可以使用find命令进行搜索。
3、Linux rpm软件包上安装的MySQL不安装/etc/my.cnf文件
关于为什么MySQL在没有此文件的情况下也能正常启动和工作有两种说法。 第一种说法是,my.cnf是MySQL启动时的参数文件,可以没有。 此时,MySQL将使用内置的默认参数启动。 第二,MySQL将在启动时自动使用/usr/share/mysql目录中的my-medium.cnf文件。 这仅限于安装在rpm软件包中的MySQL。
解决方法:只需将/usr/share/mysql目录中的. cnf文件复制到/etc目录中,然后改名为my.cnf
slow_query_log=1
; sow _ query _ log _ file=/application/MySQL/data/localhost-slow.log
sow _ query _ log _ file=d :/PHP/wamp/sfdz/MySQL/MySQL5.6. 17/data/localhost-slow.log
log_output=table
long_query_time=1
mysql库下面是缺省的slow_log表,您可以直接将slow_query_log_file=slow_log记录在表中。
运行以下命令set global slow _ query _ log _ file=slow _ log
show VARIABLES like '%log_output% '
记录的slow sql如下所示: 您可以看到sql_text是二进制信息,而不是原始sql文本
select * from mysql.slow_log
用转换函数转换就可以了。
选择转换(SQL _ textusingutf8) sql_text from mysql.slow_log
关于低速查询记录在日志文件和表中的区别:
1 )滚动查询记录在日志文件和表中,记录本身差别不大。 在表中记录的情况下,滚动查询的执行时间信息微妙地不准确
2 )在表中记录滚动查询消息可以方便地查询,但因为是结构化数据,所以可能比在滚动查询日志文件(平面文本文件)中记录的速度慢一些) (个人推测)。 如果要记录到文件中,则必须使用mysqldumpslow工具进行分析。
3 )滚动查询不记录执行失败的查询。 例如,如果long_query_time设置为10(10秒),且一个查询超过10秒,则无法在MySQL抛出查询中记录此查询信息,因为其他原因导致执行失败。
20180701补充:
低速查询是否记录由于被阻止而超过低速查询中设置的阈值的sql? 答案是否定的。