Wann soll MySQL query_cache verwendet werden?

7

Bis vor kurzem habe ich den Abfragecache als ein sehr wichtiges Werkzeug zur Verbesserung der Abfrageleistung angesehen. Heute habe ich mir einen Podcast angehört , in dem es darum ging, den Abfrage-Cache auf 0 zu optimieren und eine bessere Speicher-Caching-Lösung (wie memcache.d) zu verwenden.

Sie erwähnten aber auch, dass es einige Fälle gibt, in denen query_cache hilfreich ist. Eine allgemeine Empfehlung wäre daher, es bei Bedarf aktivieren zu lassen (unter Verwendung SELECT SQL_CACHEeiner Konfigurationseinstellung query_cache_type = 2).

Meine Frage ist, unter der Annahme, dass Sie eine Caching-Lösung wie memcache.d eingerichtet haben, welche Umstände würden den query_cache optimaler machen?

Bearbeiten: Link hinzugefügt

Derek Downey
quelle
Der Abfrage-Cache ist sehr schlecht, wenn Sie jemals schreiben wollen. Ich bin froh, dass es in den späteren MySQL-Versionen standardmäßig deaktiviert ist.
Pacerier

Antworten:

5

Memcached (oder Coherence ) speichert ganze Ergebnismengen zwischen . Ein Cache in der Datenbank speichert Datenbankzeilen zwischen. Angenommen, Sie haben ein Zugriffsmuster, bei dem die Abfrage behoben ist und sich die Daten selten ändern (z select * from restaurants where location='london'. B. ). Sie können diese Abfrage bei jedem Hinzufügen eines neuen Restaurants tausende Male ausführen. Wenn Sie also die gesamte Ergebnismenge zwischenspeichern, ist es sinnvoll, jedes Mal in die Datenbank zu wechseln. Sie verfügen jedoch weiterhin über die Verwaltbarkeit und Flexibilität von RDBMS und SQL (Sie müssen nur gelegentlich den Cache rausschmeißen, wenn sich die Daten ändern). Einige Leute nennen diese Referenzdaten oder statische Daten.

Angenommen, Sie haben ein Ad-hoc-Zugriffsmuster (möglicherweise gibt es viele Optionen für Ihren Benutzer, um genau zu finden, wo er heute Abend essen möchte, aber es kommt selten vor, dass zwei Benutzer genau dieselben Einstellungen haben). Dann möchten Sie möglicherweise die Zeilen zwischenspeichern (um das Speichern auf der Festplatte zu sparen), aber jede Ergebnismenge im laufenden Betrieb im Speicher zusammenstellen. Dann möchten Sie, dass die Datenbank selbst verwaltet, was und wie sie zwischengespeichert wird. In den meisten Fällen funktioniert ein hybrider oder mehrschichtiger Ansatz am besten.

Beachten Sie, dass es auch eine dritte Art von Caching in Aktion gibt - den Dateisystem-Cache des Betriebssystems. Ich mag diese nicht, aus dem einfachen Grund, dass wenn Sie einen Block von der Festplatte lesen, dieser jetzt im Datenbank-Cache und im Dateisystem-Cache vorhanden ist, die Datenbank jedoch nichts über letzteren "weiß" und dies daher nicht kann Machen Sie etwas Kluges damit, wie sehen Sie, wie oft es verwendet wird. Aus Sicht des Datenbankadministrators wird jeglicher freie Speicherplatz auf dem System verschwendet, über das hinaus, was das Betriebssystem selbst benötigt, um zufrieden zu sein.

Gaius
quelle
1
Gilt das wirklich für MySQL? query_cache_limit beschreibt die maximale Größe der Ergebnismenge, die nach meinem Verständnis zwischengespeichert werden kann.
Sam Brightman
Ein Cache wie Oracle Coherence speichert normalerweise keine Ergebnismengen per se zwischen, sondern speichert die "Dinge", die Ihre Anwendung aus mehreren Abfragen zusammensetzt - Dinge wie "Datenobjekte" oder DTOs oder POJOs oder Dokumente wie XML oder JSON . Der Weg, diese effektiv zwischenzuspeichern, besteht darin, entweder (a) alles vorzuladen (ich denke, das haben Sie gemeint) oder (b) nur bei Cache-Miss zu laden - was mit einem "durchgelesenen" Cache gut gelungen ist. Anschließend wird der Cache entweder zeitlich begrenzt (für Caches, die fehlerhafte Daten zulassen), oder Sie machen den Cache auf App-Ebene ungültig oder Sie streamen Aktualisierungen aus der Datenbank in den Cache.
cpurdy
@Gaius, warum sagt man, dass der MySQL-Abfrage-Cache im Gegensatz zu ganzen Ergebnismengen nur Datenbankzeilen zwischenspeichert? Entsprechen die Datenbankzeilen der Abfrage nicht der gesamten Ergebnismenge?
Pacerier
Da der Datenbankcache Ihnen einen Roundtrip auf die Festplatte erspart, können Sie die Abfrage nicht erneut ausführen (obwohl Sie möglicherweise eine erneute Analyse erhalten). Während memcached einen Hash des Textes der Abfrage verwendet, um direkt auf den Cache zuzugreifen.
Gaius
6

Ich denke, es gibt viele falsche Informationen über den Abfrage-Cache da draußen.

Der beste Fall für den Abfragecache ist, wenn Sie eine sehr große Anzahl von Zeilen untersuchen müssen, aber nur wenige an einen Client zurückgeben müssen. Eine typische Situation, in der dies häufig vorkommt, ist ein System, in dem keine ordnungsgemäße Optimierung oder Indizierung angewendet wurde.

In einer Situation, in der viele der Abfragen Primärschlüssel-Lookups sind oder auf andere Weise sehr gut optimiert sind, kann der Abfrage-Cache eine negative Skalierbarkeit verursachen. Ja, das macht alles noch schlimmer!

Der Grund dafür ist, dass das Design einige interne Sperren hinzufügt, die die Skalierung Ihres MySQL-Servers auf Multi-Core-Computern einschränken.

Der Abfrage-Cache ist eine Ursache für viele "plötzliche Verzögerungen" in MySQL - nicht alle sind offensichtlich. In Percona Server haben wir der Prozessliste einen neuen Status hinzugefügt (Warten auf Qcache-Mutex): http://www.percona.com/docs/wiki/percona-server:features:status_wait_query_cache_mutex

(Haftungsausschluss, ich arbeite für Percona.)

Morgan Tocker
quelle
3

Ich glaube nicht, dass es hier bereits erwähnt wird, aber es ist möglich, dass der Abfrage-Cache auch die Leistung beeinträchtigt. Vielleicht wurde dies in Ihrem Podcast erwähnt. Wenn die Effizienz des Abfragecaches gering ist ( Qcache_hits / (Qcache_hits + Com_select)) und viele Abfragecache-Pflaumen ( Qcache_lowmem_prunes/Uptime) auftreten, ist es möglich, dass der Aufwand für die Verwaltung des Caches mehr kostet als Sie gewinnen.

Dieser Beitrag von Peter Zaitsev behandelt die Dinge etwas detaillierter. Im Gegensatz zu einigen Antworten hier gibt er an, dass der Cache für ganze Ergebnismengen ist. Die Stelle ist jedoch mehrere Jahre alt. Einige neuere Gedanken wurden im April veröffentlicht.

Ich hatte immer den Eindruck, dass vollständige Ergebnismengen zwischengespeichert werden, nicht wie oben erwähnt. Wenn Sie genau dieselbe Abfrage haben, wird das Parsen / Planen übersprungen und dieselbe Ergebnismenge zurückgegeben (deren maximale Größe von gesteuert wird query_cache_limit).

Sam Brightman
quelle
1

Wenn Sie den Abfragecache deaktiviert haben, ist in einer Umgebung mit hohem Lesezustand, in der die SELECTs sehr einfach sind, keine Sperrmechanismen aktiviert. Ich habe dies erst kürzlich mit MySQL 5.5 unter Verwendung mehrerer Pufferpools erlebt.

Wenn Sie dieselben grundlegenden Abfragen wiederholt aufrufen, müssen Sie dieselbe Abfrage nicht immer wieder analysieren, bis die Kühe nach Hause kommen. Ein kleiner Abfrage-Cache sollte in einer Umgebung mit starkem Lesevorgang ausreichen, wenn ein kleiner Satz von SELECTs verwendet wird, von denen Sie wissen, dass sie immer aufgerufen werden.

memcached ist viel praktischer für große Datenmengen in Umgebungen mit starker Lesefähigkeit. Der Abfrage-Cache ist zu diesem Zeitpunkt eine lahme Ente.

RolandoMySQLDBA
quelle