[英]“Caching” mySQL queries, is this an OK practice?
在我的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_()
返回資源並記錄是否出了問題。
通過緩存數據庫查詢的結果資源,您將不會獲得很多性能改進。 數據庫引擎已經提供了對頻繁執行的查詢的緩存,並且您仍然必須將該資源轉換為數組,這是大部分開銷的來源。
如果要提高性能,請考慮准備語句並緩存結果數組而不是資源。 這樣,您不必一遍又一遍地處理結果,而只需從緩存中獲取結果實際數組。
數據庫查詢通常是執行時間的很大一部分,因此,如果可以緩存它們,則應該這樣做。
也就是說,最好將它們保存在命名變量(或關聯數組中的命名變量)中。 為什么要遍歷數組而不是僅僅這樣做:
if(isset($cache_result[$query])) {
return $cache_result[$query];
} else {
// not cached
}
這是一個很好的問題! 對您的問題有一個一般性的答案。
在您的情況下,您似乎在頁面的持續時間內創建了一個緩存條目。
這是可能的其他並發事務覆蓋數據庫,讓你的緩存的結果無效 ,但通常一個頁面是非常快的加載和沖突的可能性就足夠了罕見。
另外,您似乎沒有在創建銀行系統,所以我認為這還可以。
記住 ! 緩存將在頁面加載后銷毀,即。 它不會在多個頁面加載中持續存在(每個頁面加載將至少花費一個查詢)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.