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.
Fehlerbehebung bei der Abfrageleistung für Aurora MySQL-Datenbanken
MySQL ermöglicht die Steuerung des Abfrageoptimierers
Die Abfrageleistung hängt von vielen Faktoren ab, darunter dem Ausführungsplan, dem Tabellenschema und der Größe, Statistiken, Ressourcen, Indizes und der Parameterkonfiguration. Die Abfrageoptimierung erfordert die Identifizierung von Engpässen und die Optimierung des Ausführungspfads.
-
Suchen Sie den Ausführungsplan für die Abfrage und überprüfen Sie, ob die Abfrage die entsprechenden Indizes verwendet. Sie können Ihre Abfrage optimieren, indem Sie die Details der einzelnen Pläne verwenden
EXPLAIN
und überprüfen. -
Aurora MySQL Version 3 (kompatibel mit MySQL 8.0 Community Edition) verwendet eine
EXPLAIN ANALYZE
Anweisung. DieEXPLAIN ANALYZE
Anweisung ist ein Profilierungstool, das zeigt, wo MySQL Zeit für Ihre Anfrage aufwendet und warum. MitEXPLAIN ANALYZE
, Aurora MySQL plant, bereitet und führt die Abfrage aus, während gleichzeitig Zeilen gezählt und die Zeit gemessen wird, die an verschiedenen Punkten des Ausführungsplans verbracht wurde. Wenn die Abfrage abgeschlossen ist, werden der Plan und seine Messungen anstelle des AbfrageergebnissesEXPLAIN ANALYZE
gedruckt. -
Halten Sie Ihre Schemastatistiken mithilfe der
ANALYZE
Anweisung auf dem neuesten Stand. Der Abfrageoptimierer kann aufgrund veralteter Statistiken manchmal schlechte Ausführungspläne auswählen. Dies kann aufgrund ungenauer Kardinalitätsschätzungen von Tabellen und Indizes zu einer schlechten Leistung einer Abfrage führen.last_update
In der Spalte der Tabelle innodb_table_stats wird angezeigt, wann Ihre Schemastatistikenzuletzt aktualisiert wurden. Dies ist ein guter Indikator für „Veraldung“. -
Andere Probleme können auftreten, wie z. B. eine schiefe Verteilung von Daten, die bei der Tabellenkardinalität nicht berücksichtigt werden. Weitere Informationen finden Sie unter Schätzung der ANALYZE TABLE-Komplexität für InnoDB-Tabellen
und Histogrammstatistiken in MySQL in der MySQL-Dokumentation .
Den Zeitaufwand für Abfragen verstehen
Es gibt folgende Möglichkeiten, den Zeitaufwand für Abfragen zu ermitteln:
- Profilerstellung
-
Standardmäßig ist die Profilerstellung deaktiviert. Aktivieren Sie die Profilerstellung, führen Sie dann die langsame Abfrage aus und überprüfen Sie das zugehörige Profil.
SET profiling = 1;
Run your query.
SHOW PROFILE;-
Identifizieren Sie die Phase, in der die meiste Zeit verbracht wird. Gemäß den allgemeinen Thread-Zuständen
in der MySQL-Dokumentation ist das Lesen und Verarbeiten von Zeilen für eine SELECT
Anweisung oft der am längsten laufende Zustand während der Lebensdauer einer bestimmten Abfrage. Sie können dieEXPLAIN
Anweisung verwenden, um zu verstehen, wie MySQL diese Abfrage ausführt. -
Sehen Sie sich das Protokoll für langsame Abfragen an
rows_sent
, um eine Bewertung vorzunehmenrows_examined
und sicherzustellen, dass die Arbeitslast in jeder Umgebung ähnlich ist. Weitere Informationen finden Sie unter Protokollierung für Aurora MySQL-Datenbanken. -
Führen Sie den folgenden Befehl für Tabellen aus, die Teil der identifizierten Abfrage sind:
SHOW TABLE STATUS\G;
-
Erfassen Sie die folgenden Ausgaben vor und nach der Ausführung der Abfrage in jeder Umgebung:
SHOW GLOBAL STATUS;
-
Führen Sie die folgenden Befehle in jeder Umgebung aus, um festzustellen, ob andere Abfragen/Sitzungen die Leistung dieser Beispielabfrage beeinflussen.
SHOW FULL PROCESSLIST; SHOW ENGINE INNODB STATUS\G;
Wenn die Ressourcen auf dem Server ausgelastet sind, wirkt sich dies manchmal auf jeden anderen Vorgang auf dem Server aus, einschließlich Abfragen. Sie können auch regelmäßig Informationen erfassen, wenn Abfragen ausgeführt werden, oder einen
cron
Job einrichten, um Informationen in sinnvollen Intervallen zu erfassen.
-
- Leistungsschema
-
Das Leistungsschema bietet nützliche Informationen über die Leistung der Serverlaufzeit und hat gleichzeitig nur minimale Auswirkungen auf diese Leistung. Dies unterscheidet sich von der
information_schema
, die Schemainformationen über die DB-Instance bereitstellt. Weitere Informationen finden Sie unter Überblick über das Leistungsschema für Performance Insights auf Aurora My SQL My SQL. - Den Trace des Optimizers abfragen
-
Um zu verstehen, warum ein bestimmter Abfrageplan für die Ausführung ausgewählt wurde
, können Sie den optimizer_trace
Zugriff auf den MySQL-Abfrageoptimierer einrichten.Führen Sie einen Optimierer-Trace aus, um ausführliche Informationen zu allen Pfaden anzuzeigen, die dem Optimierer zur Verfügung stehen, und zu seiner Auswahl.
SET SESSION OPTIMIZER_TRACE="enabled=on"; SET optimizer_trace_offset=-5, optimizer_trace_limit=5; -- Run your query. SELECT * FROM table WHERE x = 1 AND y = 'A'; -- After the query completes: SELECT * FROM information_schema.OPTIMIZER_TRACE; SET SESSION OPTIMIZER_TRACE="enabled=off";
Überprüfen der Einstellungen des Abfrageoptimierers
Aurora MySQL Version 3 (kompatibel mit MySQL 8.0 Community Edition) weist im Vergleich zu Aurora MySQL Version 2 (kompatibel mit MySQL 5.7 Community Edition) viele Optimierungsänderungen auf. Wenn Sie einige benutzerdefinierte Werte für haben, empfehlen wir Ihnenoptimizer_switch
, die Unterschiede in den Standardeinstellungen zu überprüfen und optimizer_switch
Werte festzulegen, die für Ihren Workload am besten geeignet sind. Wir empfehlen Ihnen außerdem, die für Aurora MySQL Version 3 verfügbaren Optionen zu testen, um zu überprüfen, wie Ihre Abfragen funktionieren.
Anmerkung
Aurora MySQL Version 3 verwendet den Community-Standardwert 20 für den Parameter innodb_stats_persistent_sample_pages
Sie können den folgenden Befehl verwenden, um die Werte optimizer_switch
anzuzeigen:
SELECT @@optimizer_switch\G;
Die folgende Tabelle zeigt die optimizer_switch
Standardwerte für Aurora MySQL Versionen 2 und 3.
Einstellung | Aurora-MySQL-Version 2 | Aurora-MySQL-Version 3 |
---|---|---|
batched_key_access |
aus | aus |
block_nested_loop |
on | on |
condition_fanout_filter |
on | on |
derived_condition_pushdown |
– | on |
derived_merge |
on | on |
duplicateweedout |
on | on |
engine_condition_pushdown |
on | on |
firstmatch |
on | on |
hash_join |
aus | on |
hash_join_cost_based |
on | – |
hypergraph_optimizer |
– | aus |
index_condition_pushdown |
on | on |
index_merge |
on | on |
index_merge_intersection |
on | on |
index_merge_sort_union |
on | on |
index_merge_union |
on | on |
loosescan |
on | on |
materialization |
on | on |
mrr |
on | on |
mrr_cost_based |
on | on |
prefer_ordering_index |
on | on |
semijoin |
on | on |
skip_scan |
– | on |
subquery_materialization_cost_based |
on | on |
subquery_to_derived |
– | aus |
use_index_extensions |
on | on |
use_invisible_indexes |
– | aus |
Weitere Informationen finden Sie unter Switchable Optimizations (MySQL 5.7)