View a markdown version of this page

Anleitung für das Tuning von Abfragen - AWS Präskriptive Leitlinien

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Anleitung für das Tuning von Abfragen

Nachdem Sie problematische Abfragen in Ihrem Workload identifiziert haben, sollte jede Abfrage optimiert werden. Verwenden Sie die folgenden Richtlinien zur Optimierung, damit Ihr Workload effizienter ausgeführt werden kann.

Minimieren der Anzahl der gescannten Zeilen

So einfach es auch scheinen mag, dies ist ein guter Ratschlag, den Sie bei der Optimierung von Abfragen verwenden sollten. Verwenden Sie die EXPLAIN-Anweisung und überprüfen Sie anhand der Zeilenspalte, wie viele Zeilen der Optimizer bei jeder Verknüpfung scannt. Versuchen Sie, die Anzahl der gescannten Zeilen zu reduzieren, indem Sie einen optimalen Index erstellen, und erläutern Sie dann Ihre Abfrage erneut, um Ihre Arbeit zu bestätigen. Weitere Informationen finden Sie in der MySQL-Dokumentation.

Wenn Sie partitionierte Tabellen verwenden, fragen Sie sie immer mit der WHERE-Klausel ab, die das Bereinigen von Partitionen ermöglicht, sodass der Optimierer nicht jede Partition scannen muss. Wenn Ihre WHERE-Klausel eine Konstante für die partitionierte Spalte enthält, weiß der Optimierer, nach welcher Partition er suchen muss und das macht Ihre Abfrage effizienter.

Ein weiterer Aspekt dieses Ratschlags ist das Design Ihrer Datenbank. Je weniger Tabellen Ihre Abfrage enthält, desto schneller wird Ihre Abfrage sein. Wenn Sie Ihren Datenbankentwurf denormalisieren können, können Sie den Optimierer veranlassen, weniger Zeilen zu scannen, was zu einer schnelleren Abfrageleistung führt.

Minimieren der Nutzung temporärer Tabellen und temporärer Tabellen auf der Festplatte

Der Optimizer von Aurora-MySQL-kompatible erstellt temporäre Tabellen sowohl im RAM als auch auf der Festplatte, wenn er die gewünschten Ergebnisse Ihrer Abfrage nicht direkt aus Indizes abrufen kann. Daher besteht ein großer Teil der Optimierung darin, über die richtigen Indizes zu verfügen, die Ihrem Workload gerecht werden. Möglicherweise enthält Ihr Workload jedoch Abfragen, die sich nicht nur auf Indizes stützen können, sodass einige Operationen möglicherweise in einer temporären Datei ausgeführt werden. Das ist in Ordnung, solange Sie diese auf ein Minimum beschränken und sicherstellen, dass nur sehr wenige Tabellen auf der Festplatte erstellt werden. MySQL erstellt Festplattentabellen, wenn die Größe der temporären Tabelle zu groß ist, um im Speicher untergebracht zu werden. Die Logik, mit der MySQL die Größe der internen temporären Tabelle überprüft, ist der kleinere der beiden Variablenwerte tmp_table_size und. max-heap-table-size Sie können diese Variablen auf der Grundlage Ihres Workloads auf einen optimalen Wert einstellen, sodass Sie in Fällen, in denen Sie temporäre Tabellen nicht verhindern können, sie nur in seltenen Fällen auf die Festplatte übertragen.

Vermeiden von Dateisortierungen

Wenn Ihr Workload viele ORDER BY-Abfragen enthält, ist der beste Weg, diese zu lösen, die Verwendung der richtigen Indizes für Ihre Tabellen. Stellen Sie sicher, dass Ihre mehrspaltigen Indizes gut gestaltet sind, um das Sortieren in Dateien zu vermeiden. Eine Spalte kann nicht sortiert werden, wenn die vorherigen Spalten nicht mit Konstanten gescannt wurden (in, >, <, != und BETWEEN erlaubt keine Sortierung in der nächsten Spalte rechts). Die optimale Methode zum Sortieren in MySQL besteht darin, einen mehrspaltigen Index zu platzieren, der Spalten, die in der Abfrage angegebene konstante Werte enthalten, links von der Sortierspalte in einer zusammenhängenden Struktur positioniert. Wenn Ihre Abfrage in letzter Instance keine Ergebnisse ohne Dateisortierung zurückgeben kann, verschieben Sie die Sortierung in die Anwendung.

Vermeiden Sie es, Aggregationsabfragen mit hoher Parallelität auszuführen

Ihr Workload enthält möglicherweise eine geringe Anzahl von Aggregationsabfragen, um einige Funktionen in Ihrer Anwendung zu erfüllen. Dieser Anwendungsfall erfordert viel Vorsicht. Die InnoDB-Engine ist auf korrekte OLTP-Ladevorgänge (Online Transaction Processing) ausgelegt, aber selbst einige Gruppenabfragen bei hoher Parallelität können die CPU stark belasten und die Leistung Ihres Clusters schnell beeinträchtigen. Um Anwendungsfälle zu lösen, in denen Sie aggregierte Ergebnismengen benötigen, aggregieren Sie die Daten vorab in lesbaren Tabellen, sodass Sie das Gruppieren nach Abfragen ganz vermeiden können.

Testen Sie Ihre Abfragen auf Parallelität

Denken Sie bei der Optimierung einzelner Abfragen daran, dass diese Abfragen gleichzeitig auf mehreren v CPUs in Aurora MySQL-kompatibel ausgeführt werden. Ihre Abfrage kann in Ihrer Testumgebung bei einzelnen Durchläufen in wenigen Millisekunden ausgeführt werden. Aber das ist nicht das ganze Bild. Testen Sie Ihre Abfrage unbedingt mit dem erwarteten Grad an Parallelität auf Ihrem Produktionscluster und vergleichen Sie deren Leistung. Geben Sie die Abfrage nur dann für die Produktion frei, wenn sie Ihre Parallelitätsziele erfüllt. Stellen Sie sicher, dass Sie den Optimizer hint sql_no_cache in Ihren Testskripten verwenden, damit Sie vermeiden, Ergebnisse aus dem Cache abzurufen. Sie können Tools wie mysqlslap verwenden, um den Test parallel durchzuführen und die Ergebnisse zu vergleichen.