MySQL - Erzwingen Sie, keinen Cache zum Testen der Abfragegeschwindigkeit zu verwenden

343

Ich teste die Geschwindigkeit einiger Abfragen in MySQL. Die Datenbank speichert diese Abfragen zwischen, was es für mich schwierig macht, zuverlässige Ergebnisse zu erhalten, wenn ich teste, wie schnell diese Abfragen sind.

Gibt es eine Möglichkeit, das Caching für eine Abfrage zu deaktivieren?

System: MySQL 4 unter Linux Webhosting, ich habe Zugriff auf PHPMyAdmin.

Vielen Dank


quelle

Antworten:

527

Versuchen Sie, die Option SQL_NO_CACHE (MySQL 5.7) in Ihrer Abfrage zu verwenden. (MySQL 5.6 Benutzer klicken HIER )

z.B.

SELECT SQL_NO_CACHE * FROM TABLE

Dadurch wird das Zwischenspeichern der Ergebnisse durch MySQL gestoppt. Beachten Sie jedoch, dass andere Betriebssystem- und Festplatten-Caches ebenfalls die Leistung beeinträchtigen können. Diese sind schwerer zu umgehen.

Jarod Elliott
quelle
5
Dokumentation
Salman von Abbas
4
Ein schöner Artikel über den MySQL-Abfrage-Cache. So richten Sie den Cache ein und sehen ihn in Aktion! Die Lektüre wert. databasejournal.com/features/mysql/article.php/3110171/…
Adrian P.
1
Starten Sie Ihren MySQL-Server neu, bevor Sie versuchen, die Leistung zu verbessern. Es kann sein, dass ein Prozess alles beeinflusst. Es ist mit mir passiert. Obwohl es sich um einen Kommentar handelt, der keinen direkten Zusammenhang mit dem Problem hat, kann er vielen Menschen helfen.
Dellasavia
2
Dadurch wird verhindert , aus den Ergebnissen Cachen aber ist es auch daran hindern , mit dem Cache?
Brett
3
@Brett siehe SalmanPKs Kommentar aus dem Jahr '11. Diese Dokumentseite besteht buchstäblich aus 4 Sätzen und beantwortet Ihre Frage direkt. Falls die Seite in Zukunft entfernt wird: "Sie überprüft weder den Abfragecache, um festzustellen, ob das Ergebnis bereits zwischengespeichert ist, noch das Abfrageergebnis zwischengespeichert."
Maurice
121

Eine weitere Alternative, die nur die aktuelle Verbindung betrifft:

SET SESSION query_cache_type=0;
John Carter
quelle
Mein Fehler. Es war query_cache_sizebetrachtete ich, nicht query_cache_type. Ich habe deine und SeniorDevs Antwort verwechselt.
Mike
30

Es gibt auch eine Konfigurationsoption: query_cache_size = 0

Um den Abfragecache beim Serverstart zu deaktivieren, setzen Sie die Systemvariable query_cache_size auf 0. Durch Deaktivieren des Abfragecache-Codes entsteht kein spürbarer Overhead. Wenn Sie MySQL aus dem Quellcode erstellen, können Abfrage-Cache-Funktionen vollständig vom Server ausgeschlossen werden, indem Sie configure mit der Option --without-query-cache aufrufen.

Siehe http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

Barbushin
quelle
24

Sie können auch den Befehl follow ausführen, um den Abfragecache zurückzusetzen.

RESET QUERY CACHE
djt
quelle
9
Dies ist wahrscheinlich übertrieben ... im Idealfall soll MySQL den Cache nur vorübergehend ignorieren.
BMiner
3
Dazu benötigen Sie auch spezielle Berechtigungen.
Erick Robertson
19

Ein Problem mit dem

SELECT SQL_NO_CACHE * FROM TABLE

Methode ist, dass es nur zu verhindern scheint, dass das Ergebnis Ihrer Abfrage zwischengespeichert wird. Wenn Sie jedoch eine Datenbank abfragen, die aktiv mit der zu testenden Abfrage verwendet wird, können andere Clients Ihre Abfrage zwischenspeichern, was sich auf Ihre Ergebnisse auswirkt. Ich recherchiere weiter nach Wegen, werde diesen Beitrag bearbeiten, wenn ich einen herausfinde.

wbharding
quelle
1
Aber wenn Ihr Cache von anderen gefüllt wird, bekommen Sie die Illusion, schnell zu sein. Aber manchmal nicht.
Karatedog
14

Ich würde Folgendes verwenden:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';
Sergio Costa
quelle
3

Durch die Verwendung einer benutzerdefinierten Variablen in einer Abfrage können die Abfragen nicht zwischengespeichert werden. Ich fand es ein viel besserer Indikator als zu verwenden SQL_NO_CACHE. Sie sollten die Variable jedoch an einem Ort platzieren, an dem die Variableneinstellung die Leistung nicht ernsthaft beeinträchtigt:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;
Newtover
quelle
3
"Ich fand es ein viel besserer Indikator als zu verwenden SQL_NO_CACHE." Wie das? Anscheinend benötigen Sie ein ziemlich starkes Argument für die Verwendung eines obskuren Hacks über ein explizites Schlüsselwort, es sei denn, das explizite Schlüsselwort tut nicht das, was es behauptet.
Air
1
@Air Ich fand, dass diese Lösung auch besser funktioniert als SQL_NO_CACHE. SQL_NO_CACHE funktionierte zum ersten Mal beim Ausführen der Abfrage, danach jedoch nicht mehr. Ich gehe davon aus, dass dies auf andere Mechanismen des Caching zurückzuführen ist. Ich denke, das funktioniert besser, weil eine Suche, die auf einer Variablen basiert, von keiner Ebene oder keinem Mechanismus zwischengespeichert werden kann - zumindest ist das meine beste Vermutung.
Klik
2

Wenn Sie den Abfrage-Cache deaktivieren möchten, setzen Sie 'query_cache_size' in Ihrer MySQL-Konfigurationsdatei auf 0. Wenn es auf 0 gesetzt ist, verwendet MySQL den Abfrage-Cache nicht.

Jinesh
quelle