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 LIMIT
ist, 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".
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
@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