“缓存”mySQL查询,这是一个好的做法吗?

时间:2010-12-27 22:28:58

标签: php mysql

在我的CMS中,有时我会进行冗余查询,因为一切都是独立的。是否可以缓存这样的查询?:

        global $cache_query, $cache_result;
        if(!is_array($cache_query) || !is_array($cache_result) || !in_array($q,$cache_query))
        {//The query is new. 
            $r = query_($q);
            $cache_query[] = $q;
            $cache_result[] = $r;
        }
        else
        {//The query is cached.
            foreach($cache_query as $k=>$c) // Cycle through my cached queries to find the key. Is there an getElementKey function?
                if($c == $q) {
                    if(@mysql_fetch_array($cache_result[$k])) // is the resource is still valid?
                        mysql_data_seek($cache_result[$k], 0); // rewind the pointer
                    else
                        $cache_result[$k] = query_($q); // reset the resource
                    $r = $cache_result[$k];
                    break;
                }
        }
        return $r;

或者,每次只创建一个新查询是更好的做法吗? $q是我的查询,函数query_()返回资源并记录是否出错。

3 个答案:

答案 0 :(得分:3)

通过缓存数据库查询的结果资源,您不会获得太多性能提升。数据库引擎已经为经常执行的查询提供了缓存,你仍然必须将该资源转换为数组,这是大部分开销来自的地方。

如果您想提高效果,请考虑预备语句缓存结果数组而不是资源。这样您就不必反复处理结果,而只是从缓存中获取结果实际数组。

答案 1 :(得分:1)

数据库查询通常占执行时间的很大一部分,所以如果你可以缓存它们,你应该这样做。

也就是说,将它们保存在命名变量(或关联数组中的命名变量)中可能会更好。你为什么要走遍阵列而不是只做:

if(isset($cache_result[$query])) {
    return $cache_result[$query];
} else {
    // not cached
}

答案 2 :(得分:0)

这是一个很好的问题!你的问题有一般的答案。

在您的情况下,看起来您要在页面持续时间内使用缓存条目。

其他并发事务可以 覆盖数据库并使缓存结果无效,但通常页面加载速度非常快且可能发生冲突很少见。

此外,您似乎创建银行系统,所以我猜它没问题。

<强>记住 !!!页面加载后,缓存将被销毁,即。 持续跨多个页面加载(每个页面加载至少需要一次查询)