由于应用服务器和数据库服务器是独立的,发现链接到 MySQL 数据库的时候 PHP 处理数据时页面执行的很慢,如果应用和数据库在同一个服务器上时,则速度很正常,很快,这是为什么呢?

查了下资料发现,默认安装的 MYSQL 开启了 DNS 的反向解析,MySQL 官方文档中关于 MySQL 如何使用 DNS 的说明:

当一个新的客户端连接到 mysqld 时,mysqld 会产生一个新的线程来处理这个请求。这个线程首先会检查主机名是否在缓存中存在,如果不存在,它将尝试解析这个主机名。

如果操作系统支持线程安全的 gethostbyaddr_r() 和 gethostbyname_r() 调用,这个线程会使用它们执行主机名解析。

如果操作系统不支持线程安全的调用,这个线程就会锁定一个互斥体并换为调用 gethostbyaddr() 和 gethostbyname() 。在这种情况下,第一个线程解锁互斥体之前,其他的线程将不能解析在缓存中不存在的主机名。

你可以通过添加–skip-name-resolve 参数启动 mysqld 来禁用 DNS 主机名查询。但是这将导致你在 MySQL 的授权表中只能使用 IP 数字。

如果你使用一个很慢的 DNS 和许多主机,你可以通过添加–skip-name-resolve 禁用域名查询或通过增加 HOST_CACHE_SIZE 定义的值(默认值: 128)并重新编译 mysqld 来提升性能。

你可以通过–skip-host-cache 参数禁用主机名缓存。要清空主机名缓存,可以执行一个 FLUSH HOSTS 语句或执行 mysqladmin 中的 flush-hosts 命令实现。

要完全禁用 ICP/IP 连接,请添加 –skip-networking 启动 mysqld。

好了,这样就知道原因了,解决方法(UNIX 或 LINUX 系统下)my.cnf 里面添加

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

禁用 DNS 解析,这样连接速度正常的快很多了。

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: PHP 远程链接 MySQL 速度慢的解决方法

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可