Im MYSQL-Status ist der Wert für Handler_read_rnd_next sehr hoch.
Mir ist bekannt, dass dieser Wert erhöht wird, wenn eine Abfrage ausgeführt wird, die keine richtigen Indizes hat.
Aber selbst wenn wir den Show-Status wie 'Handler_read_rnd_next' ausführen, wird dieser Wert um 2 erhöht.
Basierend auf diesem Statusflag überwachen wir einige Statistiken.
Diese Statistiken werden also jedes Mal kritisch angezeigt.
Können wir diese 'show'-Ausführungszählungen von der' Handler_read_rnd_next'-Zählung ausschließen?
Ein weiteres Beispiel dafür:
Es gibt eine Tabelle mit 10 Zeilen, die Tabelle ist in der Spalte 'Daten' indiziert, und wenn wir die folgende Abfrage ausführen:
select data from test where data = 'vwx' -> returns one row
und wenn wir den Wert von 'Handler_read_rnd_next' überprüfen, wurde er um 7 erhöht.
Das folgende Ergebnis ist der Befehl EXPLAIN für die obige Abfrage:
explain select data from test where data = 'vwx';
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, 'SIMPLE', 'test', 'ref', 'data', 'data', '35', 'const', 1, 'Using where; Using index'
Gibt es eine Möglichkeit, diesen Wert einzuschränken, oder kann ich wissen, warum dieser Wert sehr schnell erhöht wird?
quelle
Antworten:
Schauen wir uns zunächst die Definition von Handler_read_rnd_next an.
Gemäß der MySQL-Dokumentation zu Handler_read_rnd_next:
Schauen Sie sich nun Ihre Anfrage an:
Sie sagten, dass die Tabelle 10 Zeilen hat. Als Faustregel gilt, dass das MySQL Query Optimizer die Verwendung eines Index ablehnt, wenn die Anzahl der zu untersuchenden Zeilen mehr als 5% der Gesamtzahl der Zeilen beträgt.
Lass uns rechnen. 5% von 10 Zeilen sind 0,5 Zeilen. Selbst wenn die Anzahl der Zeilen, in denen Ihre Daten gefunden werden müssen, 1 beträgt, ist dies größer als 0,5. Aufgrund dieser geringeren Anzahl von Zeilen und der gerade erwähnten Indexregel führt MySQL Query Optimizer immer einen Tabellenscan durch.
Da die Spalte
data
selbst indiziert ist, wurde mysql anstelle eines Tabellenscans einen Indexscan durchgeführt.Wenn Sie mit Sicherheit wissen, dass die Testtabelle niemals wachsen wird, können Sie alle Indizes entfernen und Tabellenscans durchführen. Handler-Statusvariablen sollten nicht mehr inkrementiert werden.
quelle
Welche Version von MySQL?
Die Gründe, warum dieses Flag erhöht wird, lassen sich am besten hier dokumentieren: http://www.mysqlperformanceblog.com/2010/06/15/what-does-handler_read_rnd-mean/
Kurz gesagt, es ist nur der Zähler der Anzahl der Zeilen, die während eines vollständigen oder teilweisen Tabellenscans in der angegebenen Reihenfolge abgerufen wurden.
Nun, das heißt, ich bekomme ein anderes Ergebnis:
quelle
Wenn für die Spalte "Daten" ein eindeutiger / primärer Index vorhanden ist, haben Sie diese Abfrage bereits optimiert. Ich kann mir nicht vorstellen, dass dies weiter optimiert werden kann.
Sie können auch überprüfen, ob ein FULL TABLE SCAN durchgeführt wurde oder nicht.
Stellen Sie sicher, dass select_scan seinen Wert nicht erhöht hat. Auf diese Weise können Sie überprüfen, ob FULL TABLE SCAN ausgeführt wird oder nicht. Sie sollten versuchen, eine Abfrage zu optimieren, die FULL TABLE SCAN nicht ausführt.
quelle