Wie schätze ich die von MySQL-Abfragen ausgeführten E / A-Vorgänge?

13

Bei Amazon RDS zahlen Sie etwa 0,10 USD pro 1 Million E / A-Anforderungen. Ich habe eine sehr hohe Anzahl (in Hunderttausenden) von E / A-Anforderungen für eine Datenbank mit sehr geringem Datenverkehr festgestellt. Als ich das sah, führte ich einige weitere Nachforschungen durch und fand diese Frage, die beschreibt, dass für eine Website mit 6.000 Benutzern 800 Millionen E / A-Anfragen pro Monat generiert wurden, was ihn ungefähr 80 US-Dollar pro Monat kosten würde.

Daher möchte ich im Voraus wissen, wie viele E / A-Vorgänge eine MySQL-Abfrage generieren würde und wie diese optimiert / minimiert werden können. Gibt es eine Möglichkeit, abzuschätzen, wie viele E / A-Vorgänge eine Abfrage ausführen würde, und allgemeine Regeln, die ich befolgen kann, um sie so gering wie möglich zu halten?

Klicken Sie auf Upvote
quelle

Antworten:

2

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.

Paul White
quelle