Community Wiki Antwort generiert aus Kommentaren zu der Frage von Raymond Nijland
Verwenden Sie EXPLAIN
. Auf diese Weise können Sie feststellen, ob für eine Abfrage möglicherweise Festplatten-E / A erforderlich sind. Sie müssen in der Spalte extra "Using temporary" oder "" Using temporary vermeiden ; Verwenden von filesort (beachten Sie, dass filesort ein irreführender Name ist: Wenn die Ergebnismenge in den Arbeitsspeicher passt, wird quicksort im Arbeitsspeicher ausgeführt) ".
Dies wird höchstwahrscheinlich durch Unterabfragen / unions / order by / group by / ... verursacht. Wenn Ihr Ergebnis groß ist und eine festplattenbasierte temporäre MyISAM-Tabelle erstellt wird und Sie das Ergebnis sortieren müssen, sortieren Sie das Ergebnis Wird basierend auf E / A-Lesevorgängen und E / A-Schreibvorgängen mit dem Quicksort-Algorithmus festgelegt.
Unter Verwendung interner temporärer Tabellen in MySQL können Sie nachlesen, wann MySQL eine festplattenbasierte MyISAM-Tabelle erstellen muss. Vielleicht können Sie verwenden AVG_ROW_LENGTH * Zeilen (obwohl beachten Sie, dass die Zeilen Wert von erklärt , ist nicht exakt mit InnoDB - Engine) , wenn das Ergebnis paßt in den Haufen zu überprüfen. Siehe SHOW TABLE STATUS-Syntax .
Ist InnoDB oder MyISAM im Allgemeinen besser, um E / A-Anforderungen zu vermeiden?
InnoDB puffert Tabellendaten und Indexdaten, während MyISAM nur Indexschlüssel puffert. Eine E / A-Operation für die Tabellendaten ist erforderlich, wenn EXPLAIN SPALTE EXTRA nicht "Using index" lautet .
Wenn beide Indizes verwenden: Mit InnoDB können bei heißem Puffer Daten aus dem Speicher geladen werden. Wenn die Indizes von der Festplatte stammen müssen, können Sie eine Formel verwenden, um die erforderlichen E / A-Lesevorgänge für Auswahlen, Einfügungen und Aktualisierungen zu berechnen. Aus der Schätzung der Abfrageleistung :
Bei kleinen Tabellen finden Sie in der Regel eine Zeile in einem Suchlauf (da der Index wahrscheinlich zwischengespeichert ist). Bei größeren Tabellen können Sie davon ausgehen, dass Sie mithilfe von B-Tree-Indizes so viele Suchvorgänge benötigen, um eine Zeile zu finden:
log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1
InnoDB-Indizes sind größer, weil sie Daten vom PRIMARY / UNIQUE-Schlüssel in einem KEY-Index speichern. Dies ist schneller und erfordert noch weniger E / A-Suchvorgänge. Sie können jedoch InnoDB-Daten oder -Indizes komprimieren.