【问题标题】:How to cache a mysql_query using memcache?如何使用 memcache 缓存 mysql_query?
【发布时间】:2011-06-23 08:24:30
【问题描述】:

我想知道是否可以在内存缓存中存储“资源”,我目前正在尝试以下代码,但显然它不正确:

$result = mysql_query($sSQL);
$memcache->set($key, $result, 0, $ttl);
return $result;

【问题讨论】:

  • 资源无法缓存,查询结果... YES

标签: php mysql memcached


【解决方案1】:

我不得不不同意 zerkms。仅仅因为 MySQL 有一个缓存系统(实际上,它有几个),并不意味着优化您的数据库访问没有任何好处。 MySQL 的 Query Cache 很棒,但它仍然有局限性:

  • 不适合大型数据集
  • 查询必须相同(逐个字符)
  • 不支持使用用户定义函数、临时表或具有列级权限的表的预准备语句或查询
  • 每次修改表都会清除缓存结果,不管结果集是否受到影响
  • 除非它与 Web 服务器位于同一台计算机上,否则它仍然会产生不必要的网络开销

即使使用远程服务器,Memcached is roughly 23% faster than MQC。并且使用 APC 的对象缓存,与单独使用 MQC 相比,您可以获得高达 990% 的改进。

所以有很多理由在 MySQL 的查询缓存之外缓存数据库结果集。毕竟,当您需要在同一脚本中多次访问结果数据时,您会将结果数据本地缓存在 PHP 变量中。那么,如果结果集没有改变,为什么不将其扩展到多个请求呢?

仅仅因为服务器足够快并不意味着您不应该努力编写高效的代码。缓存数据库结果并不需要付出太多努力——尤其是当 APC 和 Memcached 等加速器专为此目的而设计时。 (当some of the largest sites on the internet use Memcached in conjunction with MySQL 时,我不会认为这个问题是一个“奇怪的想法”。)

也就是说,zerkms 是正确的,因为您必须先获取结果,然后才能使用 APC 或 Memcached 缓存数据。然而,还有另一种手动缓存查询结果的选项,即使用Mysqlnd query result cache plugin。这是 MySQL 查询结果的客户端缓存。

Mysqlnd 查询结果缓存插件允许您使用 APC、Memcached、sqlite 或用户指定的数据源透明地缓存您的查询。但是,这个插件目前与 MQC 有相同的限制,即无法缓存准备好的语句。

【讨论】:

    【解决方案2】:

    你为什么需要这个? Mysql有自己的性能 query cache

    但如果您仍然想遵循您的奇怪想法 - 您需要将所有数据提取到数组中(使用 mysql_fetch_assoc 或其他),然后将该数组存储到 memcached 中。

    【讨论】:

    • 我不希望我的应用程序两次查询我的数据库以获取相同的内容。
    • @mnml: memcached 不也是存储吗?查询 mysql(并从查询缓存中检索数据)和从 memcached 中检索有什么区别? ;-) 无论如何,您应该从资源中提取所有数据并缓存结果数组。
    • 当您拥有多个服务器时会有所不同:它减少了网络服务器和数据库之间的网络流量,并且一旦查询在缓存中它也更快。
    • @mnml “我不想要”更像是一时兴起而不是明智的理由。你有吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多