MySQL:Navicat 执行 SQL 查询数据库卡顿

问题描述

Navicat 连接阿里云 RDS Mysql 数据库,第一次查询挺快,过一会再执行 SQL 会卡顿 20s 左右才出结果,
同时发现在同一个查询界面创建的临时表,在过一段时间再执行相同的创建临时表语句会卡顿并且临时表创建成功了(按理应该提示表已存在),说明之前的临时表丢了。

网上资料

Mysql 服务器端会定时清理长时间不活跃空闲的数据库连接,以此优化数据库的性能。
Navicat 客户端有一个设置:保持连接间隔,默认是 240 秒!
意思是,客户端在用户无任何交互性操作时,会每隔 240 秒给 Mysql 服务端发送一次数据请求,以此来保持数据库连接活跃!

然而 Navicat 设置的心跳包间隔太长了,Mysql 服务端直接将连接清理掉了。

当我们打开一张表的时候,Navicat 还是使用旧的连接去请求数据,发现旧的连接超时不能用了,最后又申请了一个新的连接,再去请求数据!所以导致我们过一会再次执行 SQL 时会卡顿一会儿。

解决方案

Navicat编辑数据库连接高级勾选保持连接间隔输入框设置为60 – 点击确定!

20200317221046160.png

其它方案

MySQL 会对请求的地址进行域名反向解析,也会造成外网访问 MySQL 执行查询慢。

为什么Mysql会进行DNS解析?

Mysql 数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名。用主机名在权限系统里面进行权限判断。

进行DNS解析为什么会出错?

因为当客户端发起超过百万的连接时,Mysql对于每个连接都会进行反DNS解析得到主机名这样,反向DNS解析是耗费时间的,有可能让用户感觉起来很慢。甚至有的时候,反向解析出来的主机名并没有指向这个IP地址,这时候就无法连接成功了。

解决方案:

可以在 MySQL 的配置文件里面禁止反向 DNS 解析,只需在 my.cnfmy.ini[mysqld] 段落中加入如下行即可:

[mysqld]
skip-name-resolve
skip-grant-tables

运行以下 SQL 语句可查看当前服务器 skip-name-resolve 参数配置的值:

show global variables like '%skip_name_resolve%';

参考资料

https://51.ruyo.net/14030.html
https://www.jianshu.com/p/5197249ce604

最后修改:2020 年 03 月 17 日 10 : 38 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论