在我的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_()
返回资源并记录是否出错。
答案 0 :(得分:3)
通过缓存数据库查询的结果资源,您不会获得太多性能提升。数据库引擎已经为经常执行的查询提供了缓存,你仍然必须将该资源转换为数组,这是大部分开销来自的地方。
如果您想提高效果,请考虑预备语句和缓存结果数组而不是资源。这样您就不必反复处理结果,而只是从缓存中获取结果实际数组。
答案 1 :(得分:1)
数据库查询通常占执行时间的很大一部分,所以如果你可以缓存它们,你应该这样做。
也就是说,将它们保存在命名变量(或关联数组中的命名变量)中可能会更好。你为什么要走遍阵列而不是只做:
if(isset($cache_result[$query])) {
return $cache_result[$query];
} else {
// not cached
}
答案 2 :(得分:0)
在您的情况下,看起来您要在页面持续时间内使用缓存条目。
其他并发事务可以 覆盖数据库并使缓存结果无效,但通常页面加载速度非常快且可能发生冲突很少见。
此外,您似乎不创建银行系统,所以我猜它没问题。
<强>记住强> !!!页面加载后,缓存将被销毁,即。 不持续跨多个页面加载(每个页面加载至少需要一次查询)