簡體   English   中英

“緩存” mySQL查詢,這是可以的做法嗎?

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM