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.
Antworten:
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:
quelle
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
SELECT *
undselect *
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.