sql 慢查询


mysql默认是不开启慢查询的

常用命令

1:查看是否开启慢查询
show variables like 'slow_query_log';
在这里插入图片描述
2:开启慢查询
set global slow_query_log='ON';
在这里插入图片描述
3:查看慢查询参数
设置超过多少秒的查询归为了慢查询
show variables like 'long_query_time';
在这里插入图片描述
默认是10秒
4:修改慢查询参数
set global long_query_time= 1;//修改为1秒
show variables like 'long_query_time';

修改之后,建议重新开一个会话查询(旧会话查询出的值可能是原来的10s)
在这里插入图片描述

用命令设置的,会立即生效,不用重启mysql服务。但重启mysql服务后就会失效。
5:查看慢查询存放日志
show variables like 'slow_query_log_file';
在这里插入图片描述
6:查看日志内容

只有当一个SQL的执行时间(不包括锁等待的时间 lock_time)>long_query_time的时候,才会判定为慢查询SQL;但是判定为慢查询SQL之后,输出的Query_time包括了(执行时间+锁等待时间),并且也会输出Lock_time时间。当一个SQL的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待超过了很久),也不会记录到慢查询日志当中的。

举个简单的例子:
如果long_query_time设置为1秒
一个insert被lock了10秒,执行只耗了0.5秒,那么不会被记录到慢日志。
在这里插入图片描述
Queue_time :查询时间=执行时间+锁等待时间
Lock_time:锁等待时间(锁持有时长)(执行这条语句的时候锁定了多久)
Rows_sent:返回客户端的行数
Rows_examined:优化器扫描行数

通常需要优化的就是最后一个内容,尽量减少SQL语句扫描的数据行数。
7:查看一共执行过几次慢查询
show global status like '%slow%';
在这里插入图片描述
8:执行一次慢查询操作
其实想要执行一次有实际意义的慢查询比较困难,因为在自己测试的时候,就算查询有20万条数据的海量表,也只需要0.几秒。我们可以通过如下语句代替:

SELECT SLEEP(10);

配置文件去修改慢sql(永久生效)

mysql配置文件一般在 /etc/my.conf
在这里插入图片描述

在这里插入图片描述

log-query-not-using-indexes:记录下没有使用索引的query