MySQL慢查询日志,看完你就会了

运维过程中,当开发反馈程序请求很慢时,底层硬件和基础设施环境又没有问题时候,我们可以通过查询数据库慢请求查询日志,可以定位到是哪一条语句查询比较慢,找到这条语句之后,如何去分析它慢的原因呢?最简单的方法,可以通过explain解析。

一、如何开启慢查询日志

1、查看慢查询日志是否开启

执行命令:show variables like ‘slow%’。

得到以下结果:
在这里插入图片描述

可以看到slow_query_log属性是OFF,处于关闭状态,那么我们需要先开启慢查询。

slow_query_log_file表示慢查询日志文件的存放路径,我们可以自定义文件路径:

set global slow_query_log_file = ‘路径’。

2、开启慢查询日志

执行命令:set global slow_query_log = on。

然后再查询一下,发现slow_query_log处于开启状态:
在这里插入图片描述

开启了之后,是不是所有的查询都会记录在文件里呢?

当然不是,慢查询日志,顾名思义是只记录查询比较慢的语句,那问题又来了,怎么才算查询比较慢的语句呢?

实际上,这里会有一个标准值,而且这个标准值是可以由我们自己设定的。

3、慢查询的临界值设定

首先查看一下默认的临界值。

执行命令:show variables like ‘%long%’。

在这里插入图片描述

其中有一个long_query_time属性,它的值为10.000000。它表示的意思是,只记录查询时间在10s以上的语句。

显然10s我们是不可接受的,所以我们需要自己设定一下这个值。因为我自己的测试表中只有10w条数据,查询很快,所以这里我们设置的小一点。如果有条件的话,最好设置一个百万级的表进行测试。

我们把慢查询的临界值设置为0.02:set long_query_time=0.02。
在这里插入图片描述

可以看到现在临界值是0.02秒了。

现在来模拟查询时间小于0.01和大于0.01的两个查询,看是否都记录在了慢查询日志中。

在这里插入图片描述

然后看一下日志文件中的数据:

在这里插入图片描述

可以看到只有第二条查询的日志。

需要注意的是,我们上面的操作是在交互界面进行的,如果数据库进行重启,这些设置都会失效。如果要永久生效,需要修改配置文件:

$ vi /etc/my.cnf
[mysqld]
slow_query_log = 1
long_query_time = 0.1
slow_query_log_file =/usr/local/mysql/mysql_slow.log

在配置文件中加上这三行就可以了。主要要重启mysql才能生效!

二、慢查询语句解析

我们通过慢查询日志,可以定位到是哪一条语句查询比较慢,找到这条语句之后,如何去分析它慢的原因呢?

1、最简单的方法,可以通过explain解析

执行命令:explain (sql语句)。

我们把上面执行的两条语句放一起对比解析一下:
在这里插入图片描述

需要重点关注possible_keys、key、rows这几个属性值。

possible_keys表示该语句可能会用到的索引。

key表示该语句实际用到的索引。

rows表示该语句扫描的行数。

通过这些属性,我们可以大致的分析一下,第一条语句没有走索引,它扫描了9万多行数据,所以查询速度比较慢,而第二条语句走了主键索引,仅仅扫描了一条语句,所以它的执行速度比较快。这样我们就可以快速定位到问题,然后针对性的去解决。

三、开启性能详情

如果通过上面的语句解析没有定位到问题,我该加的索引也加了,但是还是比较慢,那就可以通过性能详情来进一步的探究一下原因。

性能详情可以追踪查询语句的整个生命周期的状态,有了这些状态值,就可以从更深层次找出具体是哪个环节慢了,从而能针对性的进行改善。

1、查看性能详情是否开启

执行命令:show variables like ‘%profiling%’。
在这里插入图片描述

可以看到profiling属性值为OFF,表示关闭,那么我们先开启它。

执行命令:set profiling = on 。
在这里插入图片描述

这样就开启了。开启之后,我们就可以执行查询语句,mysql会自动的保存性能记录。

2、查看性能记录

我们执行一条sql语句:

在这里插入图片描述

然后查看性能记录:

执行命令:show profiles。
在这里插入图片描述

可以看到开启后的所有查询语句的记录。我们想查看一下第二条执行语句的整个执行周期的状态详情:

执行命令:show profile for query 2。
在这里插入图片描述

可以看到整个执行过程每个状态的耗时情况。然后定位到具体是哪个状态最耗时,然后针对性的排查原因。

### 解决 MySQL 客户端输入密码后立即退出的问题 当遇到 MySQL 客户端在输入密码后立即退出的情况时,可能由多种因素引起。以下是详细的解决方案: #### 1. 检查日志文件 查看 MySQL 的错误日志可以帮助定位问题所在。通常,MySQL 错误日志位于数据目录下,默认路径可能是 `/var/log/mysql/error.log` 或者通过 `mysqld --help --verbose | grep "log-error"` 查找具体位置。 ```bash tail -f /path/to/mysql/error.log ``` 这一步骤有助于发现是否有任何明显的错误提示[^2]。 #### 2. 验证配置文件 有时不正确的配置可能导致客户端无法正常工作。检查 `my.cnf` 或 `my.ini` 文件中的设置是否合理,特别是关于权限验证的部分。如果之前为了绕过认证而临时加入了 `skip-grant-tables` 参数,则应将其移除并恢复正常状态后再尝试连接[^4]。 #### 3. 更新用户表信息 对于某些版本的 MySQL,在更新到较新的版本之后可能会出现由于旧版遗留下来的账户定义而导致的问题。可以考虑执行如下 SQL 命令来修复潜在的数据一致性问题: ```sql USE mysql; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword'; FLUSH PRIVILEGES; QUIT; ``` 上述操作会强制重新加载授权表并将 root 用户的身份验证方式更改为默认插件(mysql_native_password),同时为其分配一个新的强密码。 #### 4. 使用安全模式重置密码 如果怀疑是因为忘记了管理员(root)账号的密码所引起的异常行为,可以通过跳过权限表的方式进入数据库,并更改密码。具体步骤如下所示: - 停止当前正在运行的服务; - 启动带有 `--skip-grant-tables` 参数的服务实例; - 进入命令行界面修改所需用户的密码; - 移除该参数使服务返回常规运作模式; 请注意这种方法仅适用于紧急情况下找回访问权,完成后的第一时间应该撤销此特殊启动选项以保障安全性[^5]。 #### 5. 升级或降级 MySQL 版本 部分特定的小版本之间可能存在兼容性缺陷或是Bug, 如果条件允许的话建议升级至最新稳定发行版或者回滚到前一个已知良好工作的版本测试看看是否会有所改善。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

企鹅侠客

您的打赏是我创作旅程中的关键燃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值