如何使用memcache缓存mysql_query?

时间:2011-02-08 10:35:41

标签: php mysql memcached

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

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

2 个答案:

答案 0 :(得分:9)

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

  • 它不适合大型数据集
  • 查询必须相同(字符的字符)
  • 它不支持使用用户定义的函数,临时表或具有列级权限的表的预准备语句或查询
  • 每次修改表时都会清除
  • 缓存结果,无论结果集是否受影响
  • 除非它与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具有相同的限制,因为无法缓存预准备语句。

答案 1 :(得分:-2)

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

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