问题:MySQL远程时缓存如何工作?

我一直在使用 PHP 5.6 进行旧电子商务应用程序的服务器迁移。

切换涉及来自 Linode 的两台 Dedicated 32 服务器。

一台服务器用于 NginX + PHP,另一台仅用于 MySQL。

遗留应用程序利用 memcached。

切换后,我可以看到由于私有入站和出站连接导致的大量内部流量。

到目前为止,这个元素没有对性能造成任何问题。

但是,我的印象是查询将被缓存在本地机器上,而不是在远程机器上。

因为如果查询缓存在远程主机上,它仍然必须通过专用网络传输结果集,而不是从 RAM 或本地 SSD 中检索。

我认为这是错误的吗?

与本地缓存相比,我可能错过了私有入站流量对整体性能更有利的点。

解答

MySQL 有一个称为 Query Cache 的功能,但是它会将查询结果集缓存在 mysqld 服务器进程中,而不是在客户端上。如果在结果缓存在查询缓存中之后再次运行完全相同的查询,它将从查询缓存中复制结果并避免再次运行查询的成本。但这不会避免通过网络将结果从 mysqld 传输到您的 PHP 应用程序的时间。

另请记住,MySQL 查询缓存已被弃用并退役。

或者,您的应用程序可以将来自查询结果的数据存储在 memcached 中,但通常这将由应用程序代码完成(我知道有 UDF 可以从 MySQL 触发器读取和写入 memcached,但这是一个坏主意)。

如果你的 memcached 服务和你的 PHP 代码不在同一个主机上,它会导致网络传输_两次_:第一次从 MySQL 查询数据时,然后再次传输数据_into_memcached,然后每次获取缓存时memcached 的数据_out_。

PHP 还有一些特性可以做内存缓存,比如APCu。我对此没有任何经验,通过简要扫描文档并不清楚它存储缓存数据的位置。

PHP 被设计为一种“无共享”的语言。每个 PHP 请求都有自己的数据,并且数据通常不会持续到下一个请求。这就是为什么缓存通常不保存在 PHP 内存中的原因。应用程序依赖于 memcached 或数据库本身,因为它们保存数据的时间比单个 PHP 请求长。

如果您有足够快的网络,那么通过网络从缓存中获取项目的成本应该不会很高。我过去工作中的性能架构师开发了这种智慧:

“远程内存比本地存储快。”

他们的意思是,如果数据在服务器上的 RAM 中,那么从 RAM 中读取数据,即使有通过网络传输数据的额外开销,通常也比从本地主机上的持久(磁盘)存储中读取数据要好。

Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐