此文章发布于60
个月前,部分信息可能已经过时
,请自行斟酌确认。
问题描述
Navicat 连接阿里云 RDS Mysql
数据库,第一次查询挺快,过一会再执行 SQL 会卡顿 20s
左右才出结果,
同时发现在同一个查询界面创建的临时表
,在过一段时间再执行相同的创建临时表语句会卡顿
并且临时表创建成功了
(按理应该提示表已存在),说明之前的临时表丢了。
网上资料
Mysql 服务器端会定时清理长时间不活跃空闲的数据库连接,以此优化数据库的性能。
Navicat 客户端有一个设置:保持连接间隔,默认是 240
秒!
意思是,客户端在用户无任何交互性操作时,会每隔 240 秒给 Mysql 服务端发送一次数据请求,以此来保持数据库连接活跃!
然而 Navicat 设置的心跳包间隔太长了,Mysql 服务端直接将连接清理掉了。
当我们打开一张表的时候,Navicat 还是使用旧的连接去请求数据,发现旧的连接超时不能用了,最后又申请了一个新的连接,再去请求数据!
所以导致我们过一会再次执行 SQL 时会卡顿一会儿。
解决方案
Navicat
– 编辑数据库连接
– 高级
– 勾选保持连接间隔
– 输入框设置为60
– 点击确定!
其它方案
MySQL 会对请求的地址进行域名反向解析
,也会造成外网
访问 MySQL 执行查询慢。
为什么Mysql会进行DNS解析?
Mysql 数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名。用主机名在权限系统里面进行权限判断。
进行DNS解析为什么会出错?
因为当客户端发起超过百万的连接时,Mysql对于每个连接都会进行反DNS解析得到主机名这样,反向DNS解析是耗费时间的,有可能让用户感觉起来很慢。甚至有的时候,反向解析出来的主机名并没有指向这个IP地址,这时候就无法连接成功了。
解决方案:
可以在 MySQL 的配置文件里面禁止反向 DNS 解析
,只需在 my.cnf
或 my.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