2010-12-27 13 views
2

In meinem CMS mache ich manchmal redundante Abfragen, weil alles unabhängig ist. Ist es in Ordnung, solche Abfragen zwischenzuspeichern ?:"Caching" mySQL-Abfragen, ist das eine gute Übung?

 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; 

ODER ist eine bessere Praxis, um jedes Mal eine neue Abfrage zu machen? $q ist meine Abfrage, und die Funktion query_() gibt eine Ressource zurück und protokolliert, wenn etwas schief geht.

Antwort

1

Datenbankabfragen sind häufig ein großer Teil Ihrer Ausführungszeit, wenn Sie sie also zwischenspeichern können, sollten Sie.

Das heißt, es könnte besser sein, sie in benannten Variablen (oder benannten Variablen in einem assoziativen Array) zu speichern. Warum gehst du durch das Array, anstatt nur zu tun:

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

Ich war besorgt, dass ich einen Index zu lange hätte. Oder ein '' 'in der Abfrage vorhanden. – Jason

+2

+1. Ein Vorschlag/Verbesserung: Da SQL-Abfragen ziemlich groß werden können, kann man den Hash-Wert der SQL-Abfrage berechnen, anstatt die Abfrage selbst als Schlüssel im assoziieren Array – Ronnis

+0

@Ronnis, ich mag das. Gute Idee. – Jason

3

Sie erhalten keine großen Leistungsverbesserungen, wenn Sie die Ergebnisressource einer Datenbankabfrage zwischenspeichern. Datenbank-Engines bieten bereits Caching für häufig ausgeführte Abfragen, und Sie müssen diese Ressource immer noch in ein Array konvertieren, von wo der meiste Overhead stammt.

Wenn Sie die Leistung verbessern möchten, sollten vorbereitete Anweisungen und das Array Ergebnis Cachen statt der Ressource. Auf diese Weise müssen Sie das Ergebnis nicht immer wieder bearbeiten, sondern nur das Ergebnis-Array aus dem Cache holen.

+0

Eigentlich, nachdem ich die Frage geschrieben habe, realisierte ich, dass ich darüber falsch dachte. Ich würde dies tun, aber ich kann mich nicht entscheiden, ob ich große Arrays lieber im Speicher speichern oder neu abfragen möchte. – Jason

+0

-1. Der größte Overhead ist neben der eigentlichen Abfrage die Kommunikation zwischen der Hostsprache und dem Datenbankserver. Die Wiederverwendung einer speicherinternen Datenstruktur ist mehrere tausend Mal schneller als die Anforderung aus der Datenbank. – Ronnis

+0

@Ronnis, ich habe das gewählt, weil die Antwort den richtigen Weg erwähnt (Zwischenspeicherung des Ergebnisarrays). –

0

das ist eine gute Frage! Es gibt eine allgemeine Antwort auf Ihre Frage.

In Ihrem Fall sieht es so aus, als ob Sie einen Cache-Eintrag erstellen, der für die Dauer Ihrer Seite verwendet wird.

Es ist möglich, dass andere gleichzeitige Transaktionen, die Datenbank zu überschreiben und die zwischengespeicherten Ergebnisse ungültig machen, aber in der Regel eine Seite sehr schnell geladen und die Möglichkeit eines Konflikts ist selten genug.

Auch sieht es so aus, als ob Sie nicht erstellen ein Banking-System, also denke ich, es ist OK.

ERINNERN SIE sich an !!! Der Cache wird nach dem Laden der Seite zerstört, d. es nicht persistieren über mehrere Seitenladungen (jede Seitenladung kostet mindestens eine Abfrage)

+0

Kümmern Sie sich nicht darum, es persistent zu machen. Nur auf der aktuellen Seite. – Jason

+0

Ich möchte Ihnen sagen, dass es keine potenziellen Probleme mit Ihrem Setup gibt, und in Ihrem Fall kann dies als eine gute Praxis beurteilt werden, wie Sie gefragt haben. Im Allgemeinen muss Caching mit äußerster Sorgfalt überprüft werden –

Verwandte Themen