2012-05-10 3 views
5

Ich perfomance eine große Abfrage und möchte es von der gleichen Grundlinie vorher und nachher zum Vergleich ausführen.wie löschen/spülen mysql innodb buffer pool?

Ich weiß über den MySQL Query Cache, aber es ist nicht relevant für mich, da die 2 Abfragen nicht im Cache gespeichert werden würde.

Was zwischengespeichert wird, sind die innodb-Seiten im Pufferpool. Gibt es eine Möglichkeit, den gesamten Pufferpool zu löschen, damit ich die beiden Abfragen vom gleichen Startpunkt aus vergleichen kann?

Während der MySQL-Server neu zu starten, nachdem jede Abfrage laufen würde ohne Zweifel Arbeit, wie Id diese wenn möglich

Antwort

8

WARNUNG zu vermeiden: Die folgenden funktioniert nur für MySQL 5.5 und MySQL 5.1.41+ (InnoDB Plugin)

die Dauer der Einträge im InnoDB Buffer Pool mit diesen Einstellungen Tweek:

SET GLOBAL innodb_old_blocks_time=250; // This is 0.25 seconds 
SET GLOBAL innodb_old_blocks_pct=5; 
SET GLOBAL innodb_max_dirty_pages_pct=0; 

Wenn Sie die Prüfung fertig sind, sie wieder auf die Standardwerte setzen:

SET GLOBAL innodb_old_blocks_time=0; 
SET GLOBAL innodb_old_blocks_pct=37; 
SET GLOBAL innodb_max_dirty_pages_pct=90; // 75 for MySQL 5.5/MySQL 5.1 InnoDB Plugin 

Überprüfen Sie die Definition dieser Einstellungen aus

+0

große Antwort, danke. Ich habe nur eine Frage ... Wenn eine Pufferseite abgelaufen ist, wird sie nur als gelöscht markiert? Ich möchte nur sicherstellen, dass kein innodb-Thread ausgeführt wird, der periodisch abgelaufene Pufferseiten löscht (und möglicherweise eine größere Belastung für die Datenbank verursacht, weil das Timeout so niedrig ist). --- Ich weiß, es ist nur vorübergehend zum Testen, aber ich muss einen guten Griff auf diese besonderen Benchmarks bekommen – carpii

+0

@Rolando, Wenn ich viele andere Programme laufen habe und MySQL brauche, um so wenig RAM wie möglich zu verwenden, bedeutet es, dass ich sollte innobb Pufferpool auf Null setzen? Oder gibt es einen Mindestbetrag? – Pacerier

2

Viel einfacher ... Run dieses zweimal

SELECT SQL_NO_CACHE ...; 

und Blick auf die Sekunden Timing.

Der erste wärmt den buffer_pool; der zweite vermeidet die QC mit SQL_NO_CACHE.

Das zweite Timing ist also ein guter Indikator dafür, wie lange es in einem Produktionssystem mit warmem Cache dauert.

Ferner Blick auf Handler zählt

FLUSH STATUS; 
SELECT ...; 
SHOW SESSION STATUS LIKE 'Handlers%'; 

ein einigermaßen klares Bild gibt, wie viele Zeilen berührt werden. Das wiederum gibt Ihnen ein gutes Gefühl dafür, wie viel Aufwand die Abfrage benötigt. Beachten Sie, dass dies in kleinen Datenmengen ziemlich erfolgreich (und schnell) durchgeführt werden kann. Dann können Sie (oft) auf größere Datensätze extrapolieren.

Ein "Handler_read" liest möglicherweise eine Indexzeile oder eine Datenzeile. Es könnte die 'nächste' Zeile sein (daher wahrscheinlich in dem Block zwischengespeichert, der für die vorherige Zeile gelesen wurde), oder es könnte zufällig sein (daher möglicherweise einem anderen Festplattentreffer unterworfen). Das heißt, die Technik hilft nicht viel mit "wie viele Blöcke benötigt werden".

Diese Handler-Technik ist unempfindlich gegenüber dem, was sonst noch vor sich geht; es gibt konsistente Ergebnisse.

"Handler_write" zeigt an, dass eine TMP-Tabelle benötigt wurde.

Zahlen, die die Anzahl der Zeilen in der Tabelle (oder ein Vielfaches davon) annähern, wahrscheinlich geben einen Tabellenscan (s) an. Eine Zahl, die das gleiche wie LIMITist, könnte bedeuten bedeuten, dass Sie so einen guten Index erstellen, dass es die LIMIT in sich verbraucht.

Wenn Sie die buffer_pool spülen tun, Sie Änderungen in Innodb_buffer_pool_reads beobachten konnte eine präzise (?) Zählung der Anzahl der Seiten in einem kalt System zu lesen zu geben. Dies würde Nicht-Blatt-Index-Seiten einschließen, die fast immer zwischengespeichert werden. Wenn im System noch etwas anderes passiert, sollte dieser STATUS Wert nicht vertrauenswürdig sein, da es "global" ist und nicht "Sitzung".

Verwandte Themen