Verfügt MySQL über einen Cache für Abfragen?

19

Ich verbinde eine MySQL-Datenbank mit PHP Data Objects (PDO) und führe eine umfangreiche SQL-Abfrage durch. Normalerweise dauert es ungefähr 1500 ms; Ich muss es noch optimieren. Wenn ich das PHP-Skript zweimal mit einem kurzen Intervall dazwischen ausführe, dauert die Abfrage nur etwa 90 ms. Die Abfrage ist in beiden Fällen gleich. Wenn ich das Skript mit derselben Abfrage nach einiger Zeit erneut ausführe, dauert es erneut 1500 ms.

Warum das? Wird die Datenbank automatisch zwischengespeichert? Gibt es eine gewisse Zeit, in der die Datenbank den Cache speichert und ihn dann automatisch löscht?

Ich gehe davon aus, dass die Ergebnisse nicht von PHP zwischengespeichert werden können, da dies in zwei verschiedenen Threads geschieht. Ich würde nicht denken, dass PHP die Ergebnisse zwischenspeichern würde, da es nicht wissen kann, ob sich die Datenbank geändert hat.

Ich habe ein Skript, das jede Minute ausgeführt wird, um neue Zeilen in die Datenbank einzufügen. Dies könnte auch der Grund sein, dass es nach einiger Zeit wieder 1500 ms dauert; Der Cache wäre gelöscht worden, da die relevanten Tabellen nicht mehr dieselben sind.

Peter Mortensen
quelle
Zeig mir deinen Code. Ich brauche Ihre Anfrage nicht, nur so, wie Sie sie testen.
3
Ja, mySQL speichert Abfragen zwischen. So klug ist es.
@Kasyx welchen Code? Es ist nur ein einfaches PDO, aber ich glaube nicht, dass PHP es zwischenspeichern kann, da ich das PHP-Skript zweimal ausführe. Ich führe die Abfrage nicht zweimal in einem Skript aus. Können Sie auch erklären, warum Sie pdo in bearbeitet haben, obwohl es für die Frage nicht wirklich relevant ist?
3
Alle DBMS haben einen Cache auf Seitenebene. Viele gehen darüber hinaus, indem sie Ausführungspläne für Abfragen oder sogar Abfrageergebnisse (einschließlich MySQL ) zwischenspeichern. Ich vermute, dass das Letzte der Hauptgrund für Ihr beobachtetes Verhalten ist.
Branko Dimitrijevic
Du machst jede Minute Einfügungen? Sortieren Sie das zuerst!
Grant Thomas

Antworten:

15

Dies ist wahrscheinlich ein Artefakt des MySQL Query Cache .

Sie führen die SQL-Abfrage aus, MySQL speichert das Ergebnis und die nächste Ausführung, wenn sie schnell ist. Wenn Sie das Skript ausführen, um die Daten in Tabellen einzufügen, auf die Ihre Abfrage verweist, wird der Ergebniscache ungültig, und die Abfrage muss das nächste Mal "echt" ausgeführt werden.

Aus der oben verlinkten MySQL-Dokumentation:

Ein Abfragemix, der fast ausschließlich aus einem festen Satz von SELECT-Anweisungen besteht, profitiert mit größerer Wahrscheinlichkeit von der Aktivierung des Caches als ein Mix, bei dem häufige INSERT-Anweisungen die Ergebnisse im Cache ständig ungültig machen.

Branko Dimitrijevic
quelle
5

Ja, mySQL speichert (wie alle anderen gängigen Datenbankprodukte auch) die darin enthaltenen Abfragen zwischen.

Das Caching ist ziemlich clever - es kann häufig einen Cache für eine Abfrage verwenden, auch wenn die genauen Parameter der Abfrage nicht identisch sind. Dies kann einen großen Unterschied für die Leistung bedeuten.

Das Caching wird vollständig in der DB-Server-Software gesteuert. Sie haben weder einen Überblick darüber, was der Cache enthält, noch darüber, wie lange ein bestimmtes Element im Cache verbleibt. Es kann zu jedem beliebigen Zeitpunkt überschrieben werden, je nachdem, welche anderen Abfragen aufgerufen werden usw. Es dient zur Unterstützung der Leistung, sollte jedoch nicht als Grundlage für die Leistung dienen.

Mehr dazu erfahren Sie hier im MySQL-Handbuch .

Darüber hinaus können Sie mit PDO Ihre Abfragen als "Prepared Statements" schreiben, indem Sie die Parameter binden, anstatt sie fest in eine einfache Textabfragezeichenfolge zu codieren. Dies hat auch Auswirkungen auf das Caching auf dem DB-Server und verbessert bei wiederholten Abfragen auch die Leistung.


quelle
2
"Ab MySQL 5.1.17 wird der Abfrage-Cache für vorbereitete Anweisungen unter den in Abschnitt 8.6.3.1,„ Funktionsweise des Abfrage-Cache “beschriebenen Bedingungen verwendet. Vor 5.1.17 wird der Abfrage-Cache nicht für vorbereitete Anweisungen verwendet." dev.mysql.com/doc/refman/5.1/en/query-cache.html
1
" Gemeinsam mit allen anderen gängigen Datenbankprodukten ": Das ist etwas irreführend. Kaum speichert alle DBMS aktiv Abfrage Ergebnisse der Weg MySQL tut. DBMS speichert normalerweise nur Tabellen- (oder Index-) Daten im Cache , keine Abfrageergebnisse . Die meisten von ihnen speichern den Abfrage-Exeutionsplan (und die Abfrage "source") zwischen
a_horse_with_no_name
3
"Es kann oft einen Cache für eine Abfrage verwenden, auch wenn die genauen Parameter der Abfrage nicht identisch sind" ist völlig falsch. Die Abfrage muss Byte für Byte mit einer zuvor ausgeführten und noch zwischengespeicherten Abfrage identisch sein, damit sie aus dem Cache bedient werden kann. Sogar der Unterschied zwischen SELECT *und select *bedeutet, dass eine ansonsten identische Abfrage nicht aus dem Cache bedient wird. dev.mysql.com/doc/refman/5.1/de/query-cache-operation.html . Verfasst aus Konsistenzgründen einen 5.1-Link, gilt jedoch für alle Versionen.
Michael - Sqlbot