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.
Bewährte Methoden für SQL Leistung und Skalierung von Aurora My
Sie können die folgenden bewährten Methoden anwenden, um die Leistung und Skalierbarkeit Ihrer Aurora SQL My-Cluster zu verbessern.
Themen
- Verwendung von T-Instance-Klassen für Entwicklung und Tests
- Optimierung von Aurora My SQL indexierten Join-Abfragen mit asynchronem Schlüssel-Prefetch
- Optimierung großer Aurora My SQL Join-Abfragen mit Hash-Joins
- Verwenden von Amazon Aurora zur Skalierung von Lesevorgängen für Ihre Meine SQL Datenbank
- Optimierung von Zeitstempeloperationen
Verwendung von T-Instance-Klassen für Entwicklung und Tests
Amazon Aurora My SQL Instancesdb.t2
, die die Instance-Klassendb.t3
,, oder db.t4g
DB verwenden, eignen sich am besten für Anwendungen, die über einen längeren Zeitraum keine hohe Arbeitslast unterstützen. Die T-Instanzen sind so konzipiert, dass sie eine mäßige Basisleistung bieten und je nach Workload eine deutlich höhere Leistung erreichen können. Sie sind für Workloads vorgesehen, die nicht CPU oft oder konsistent die volle Kapazität nutzen, aber gelegentlich überlastet werden müssen. Wir empfehlen, die T-DB-Instance-Klassen nur für Entwicklungs- und Testserver oder andere Nicht-Produktionsserver zu verwenden. Weitere Einzelheiten zu den T-Instance-Klassen finden Sie unter Burstable Performance Instances.
Wenn Ihr Aurora-Cluster größer als 40 TB ist, sollten Sie die T-Instance-Klassen nicht verwenden. Wenn Ihre Datenbank ein großes Datenvolumen hat, kann der Speicher-Overhead für die Verwaltung von Schemaobjekten die Kapazität einer T-Instance übersteigen.
Aktivieren Sie das My SQL Performance Schema nicht auf Amazon Aurora My SQL T-Instances. Wenn das Leistungsschema aktiviert ist, geht der Instance möglicherweise der Speicher aus.
Tipp
Wenn Ihre Datenbank manchmal inaktiv ist, zu anderen Zeiten jedoch eine erhebliche Arbeitslast aufweist, können Sie Aurora Serverless v2 als Alternative zu T-Instanzen. Mit Aurora Serverless v2, Sie definieren einen Kapazitätsbereich und Aurora skaliert Ihre Datenbank je nach aktueller Arbeitslast automatisch nach oben oder unten. Details zur Verwendung finden Sie unter Verwenden von Aurora Serverless v2. Für die Datenbank-Engine-Versionen, die Sie verwenden können Aurora Serverless v2, finden Sie unter Anforderungen und Einschränkungen für Aurora Serverless v2.
Wenn Sie eine T-Instance als DB-Instance in einem Aurora My SQL DB-Cluster verwenden, empfehlen wir Folgendes:
-
Verwenden Sie für alle Instances in Ihrem DB–Cluster dieselbe DB-Instance-Klasse. Wenn Sie zum Beispiel
db.t2.medium
für Ihre Writer-Instance verwenden, empfehlen wir Ihnen,db.t2.medium
auch für Ihre Reader-Instances zu verwenden. -
Nehmen Sie keine speicherbezogenen Konfigurationseinstellungen vor, wie z. B.
innodb_buffer_pool_size
. Aurora verwendet einen hochgradig abgestimmten Satz von Standardwerten für Speicherpuffer auf T-Instanzen. Diese speziellen Voreinstellungen sind erforderlich, damit Aurora auf Instanzen mit begrenztem Speicherplatz läuft. Wenn Sie speicherbezogene Einstellungen auf einer T-Instance ändern, ist es viel wahrscheinlicher, dass Sie auf out-of-memory Bedingungen stoßen, auch wenn Ihre Änderung darauf abzielt, die Puffergröße zu erhöhen. -
Überwachen Sie Ihr CPU Guthaben (
CPUCreditBalance
), um sicherzustellen, dass es sich auf einem nachhaltigen Niveau befindet. Das heißt, CPU Guthaben werden mit der gleichen Rate akkumuliert, in der sie verwendet werden.Wenn Sie die CPU Credits für eine Instance aufgebraucht haben, sehen Sie sofort einen Rückgang der verfügbaren Credits CPU und eine Erhöhung der Lese- und Schreiblatenz für die Instance. Diese Situation führt zu einem starken Rückgang der Gesamtperformance der Instance.
Wenn Ihr CPU Guthaben nicht nachhaltig ist, empfehlen wir Ihnen, Ihre DB-Instance so zu modifizieren, dass sie eine der unterstützten R-DB-Instance-Klassen verwendet (Scale Compute).
Weitere Informationen über das Überwachen von Metriken finden Sie unter Metriken in der RDS Amazon-Konsole anzeigen.
-
Überwachen Sie die Replikverzögerung (
AuroraReplicaLag
) zwischen der Writer-Instance und den Reader-Instances.Wenn einer Reader-Instance vor der Writer-Instance die CPU Credits ausgehen, kann die daraus resultierende Verzögerung dazu führen, dass die Reader-Instance häufig neu gestartet wird. Dieses Ergebnis tritt häufig auf, wenn eine Anwendung eine hohe Anzahl von Lesevorgängen hat, die auf die Reader-Instance verteilt sind, während die Schreib-Instance eine minimale Anzahl von Schreibvorgängen hat.
Wenn Sie eine anhaltende Zunahme der Replikatverzögerung feststellen, stellen Sie sicher, dass Ihr CPU Guthaben für die Reader-Instances in Ihrem DB-Cluster nicht aufgebraucht ist.
Wenn Ihr CPU Guthaben nicht nachhaltig ist, empfehlen wir Ihnen, Ihre DB-Instance so zu modifizieren, dass sie eine der unterstützten R-DB-Instance-Klassen (Scale Compute) verwendet.
-
Halten Sie die Anzahl an Inserts pro Transaktion unter 1 Million für DB-Cluster, bei denen die Binärprotokollierung aktiviert ist.
Wenn der Parameter in der DB-Cluster-Parametergruppe für Ihren DB-Cluster auf einen anderen Wert als gesetzt ist
OFF
, kann es in Ihrem DB-Cluster zu Problemen kommen, wenn der DB-Cluster Transaktionen empfängt, die mehr als 1 Million einzufügende Zeilen enthalten.binlog_format
out-of-memory Sie können den freien Speicher (FreeableMemory
) metrisch überwachen, um festzustellen, ob Ihrem DB-Cluster der verfügbare Speicher ausgeht. Sie überprüfen dann die Metrik der Schreibvorgänge (VolumeWriteIOPS
), um zu sehen, ob eine Writer-Instance eine große Last von Schreibvorgängen empfängt. Wenn dies der Fall ist, empfehlen wir, Ihre Anwendung zu aktualisieren, um die Anzahl von Einfügungen in einer Transaktion auf weniger als 1 Million zu begrenzen. Alternativ können Sie Ihre Instance so modifizieren, dass sie eine der unterstützten R DB-Instance-Klassen verwendet (scale compute).
Optimierung von Aurora My SQL indexierten Join-Abfragen mit asynchronem Schlüssel-Prefetch
Aurora My SQL kann die Funktion prefetch (AKP) für asynchrone Schlüssel verwenden, um die Leistung von Abfragen zu verbessern, die Tabellen indexübergreifend verbinden. Diese Funktion verbessert die Leistung, indem sie die Zeilen antizipiert, die für die Ausführung von Abfragen benötigt werden, bei denen eine JOIN Abfrage den Join-Algorithmus Batched Key Access (BKA) und die Optimierungsfunktionen Multi-Range Read () erfordert. MRR Weitere Informationen zu BKA und MRR finden Sie unter Block Nested-Loop und Batched Key Access Joins und
Um diese AKP Funktion nutzen zu können, muss eine Abfrage sowohl als auch verwenden. BKA MRR In der Regel tritt eine solche Abfrage auf, wenn die JOIN Klausel einer Abfrage einen sekundären Index verwendet, aber auch einige Spalten aus dem Primärindex benötigt. Sie können dies beispielsweise verwenden, AKP wenn eine JOIN Klausel ein Äquijoin für Indexwerte zwischen einer kleinen äußeren und einer großen inneren Tabelle darstellt und der Index in der größeren Tabelle sehr selektiv ist. AKParbeitet zusammen mit der Klausel BKA und MRR führt bei der Auswertung der JOIN Klausel eine Suche nach einem Sekundärindex zum Primärindex durch. AKPidentifiziert die Zeilen, die für die Ausführung der Abfrage während der Auswertung der JOIN Klausel erforderlich sind. Anschließend werden die Seiten, die diese Zeilen enthalten, mit einem Hintergrund-Thread asynchron in den Speicher geladen, bevor die Abfrage ausgeführt wird.
AKPist für Aurora My SQL Version 2.10 und höher und Version 3 verfügbar. Weitere Informationen zu Aurora SQL My-Versionen finden Sie unterDatenbank-Engine-Updates für Amazon Aurora My SQL.
Asynchrones Key Prefetch aktivieren
Sie können die AKP Funktion aktivierenaurora_use_key_prefetch
, indem Sie eine My SQL Server-Variable auf setzenon
. Standardmäßig ist dieser Wert auf on
festgelegt. AKPKann jedoch erst aktiviert werden, wenn Sie auch den BKA Join-Algorithmus aktivieren und die kostenbasierte MRR Funktionalität deaktivieren. Dazu müssen Sie die folgenden Werte für optimizer_switch
eine SQL Servervariable vom Typ „Mein Server“ festlegen:
-
Setzen Sie
batched_key_access
aufon
. Dieser Wert steuert die Verwendung des BKA Join-Algorithmus. Standardmäßig ist dieser Wert aufoff
festgelegt. Setzen Sie
mrr_cost_based
aufoff
. Dieser Wert steuert die Verwendung kostenbasierter MRR Funktionen. Standardmäßig ist dieser Wert aufon
festgelegt.
Derzeit können Sie diese Werte nur auf Sitzungsebene festlegen. Das folgende Beispiel zeigt, wie Sie diese Werte so einstellen, dass sie AKP für die aktuelle Sitzung aktiviert werden, indem SET Anweisungen ausgeführt werden.
mysql>
set @@session.aurora_use_key_prefetch=on;mysql>
set @@session.optimizer_switch='batched_key_access=on,mrr_cost_based=off';
In ähnlicher Weise können Sie SET Anweisungen verwenden, um den BKA Join-Algorithmus zu deaktivieren AKP und die kostenbasierte MRR Funktionalität für die aktuelle Sitzung wieder zu aktivieren, wie im folgenden Beispiel gezeigt.
mysql>
set @@session.aurora_use_key_prefetch=off;mysql>
set @@session.optimizer_switch='batched_key_access=off,mrr_cost_based=on';
Optimieren von Abfragen für asynchrones Key Prefetch
Sie können überprüfen, AKP ob eine Abfrage die Funktion nutzen kann. Verwenden Sie dazu die EXPLAIN
-Anweisung, um die Abfrage vor der Ausführung zu profilieren. Die EXPLAIN
-Anweisung stellt Informationen über den Ausführungsplan bereit, der für eine angegebene Abfrage verwendet werden soll.
In der Ausgabe der EXPLAIN
-Anweisung beschreibt die Spalte Extra
zusätzliche Informationen, die im Ausführungsplan eingeschlossen sind. Wenn die AKP Funktion für eine in der Abfrage verwendete Tabelle gilt, enthält diese Spalte einen der folgenden Werte:
Using Key Prefetching
Using join buffer (Batched Key Access with Key Prefetching)
Das folgende Beispiel zeigt die Verwendung vonEXPLAIN
, um den Ausführungsplan für eine Abfrage anzuzeigen, die Sie nutzen könnenAKP.
mysql>
explain select sql_no_cache->
ps_partkey,->
sum(ps_supplycost * ps_availqty) as value->
from->
partsupp,->
supplier,->
nation->
where->
ps_suppkey = s_suppkey->
and s_nationkey = n_nationkey->
and n_name = 'ETHIOPIA'->
group by->
ps_partkey having->
sum(ps_supplycost * ps_availqty) > (->
select->
sum(ps_supplycost * ps_availqty) * 0.0000003333->
from->
partsupp,->
supplier,->
nation->
where->
ps_suppkey = s_suppkey->
and s_nationkey = n_nationkey->
and n_name = 'ETHIOPIA'->
)->
order by->
value desc;+----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ | 1 | PRIMARY | nation | ALL | PRIMARY | NULL | NULL | NULL | 25 | 100.00 | Using where; Using temporary; Using filesort | | 1 | PRIMARY | supplier | ref | PRIMARY,i_s_nationkey | i_s_nationkey | 5 | dbt3_scale_10.nation.n_nationkey | 2057 | 100.00 | Using index | | 1 | PRIMARY | partsupp | ref | i_ps_suppkey | i_ps_suppkey | 4 | dbt3_scale_10.supplier.s_suppkey | 42 | 100.00 | Using join buffer (Batched Key Access with Key Prefetching) | | 2 | SUBQUERY | nation | ALL | PRIMARY | NULL | NULL | NULL | 25 | 100.00 | Using where | | 2 | SUBQUERY | supplier | ref | PRIMARY,i_s_nationkey | i_s_nationkey | 5 | dbt3_scale_10.nation.n_nationkey | 2057 | 100.00 | Using index | | 2 | SUBQUERY | partsupp | ref | i_ps_suppkey | i_ps_suppkey | 4 | dbt3_scale_10.supplier.s_suppkey | 42 | 100.00 | Using join buffer (Batched Key Access with Key Prefetching) | +----+-------------+----------+------+-----------------------+---------------+---------+----------------------------------+------+----------+-------------------------------------------------------------+ 6 rows in set, 1 warning (0.00 sec)
Weitere Informationen zum EXPLAIN
Ausgabeformat finden Sie unter Erweitertes EXPLAIN Ausgabeformat
Optimierung großer Aurora My SQL Join-Abfragen mit Hash-Joins
Wenn Sie eine große Datenmenge mit Hilfe eines Equijoins verknüpfen müssen, kann ein Hash-Join die Abfrageleistung verbessern. Sie können Hash-Joins für Aurora My aktivierenSQL.
Eine Hash-Join-Spalte kann ein beliebiger komplexer Ausdruck sein. In einer Hash-Join-Spalte haben Sie folgende Möglichkeiten, Datentypen übergreifend zu vergleichen:
-
Sie können alles über die Kategorie der präzisen numerischen Datentypen hinweg vergleichen, wie z. B.
int
,bigint
,numeric
undbit
. -
Sie können alles über die Kategorie der ungefähren numerischen Datentypen hinweg vergleichen, wie z. B.
float
unddouble
. -
Sie können Elemente über String-Typen hinweg vergleichen, wenn die String-Typen den gleichen Zeichensatz und die gleiche Sortierreihenfolge haben.
-
Sie können Elemente mit Datums- und Zeitstempel-Datentypen vergleichen, wenn die Typen identisch sind.
Anmerkung
Sie können Datentypen verschiedener Kategorien nicht miteinander vergleichen.
Die folgenden Einschränkungen gelten für Hash-Joins für Aurora MySQL:
-
Links-Rechts-Outer Joins werden für Aurora My SQL Version 2 nicht unterstützt, werden aber für Version 3 unterstützt.
-
Semijoins wie Subqueries werden nicht unterstützt, es sei denn, die Subqueries erfolgen zuerst.
-
Mehrfach-Tabellen-Updates oder -Löschungen werden nicht unterstützt.
Anmerkung
Einzel-Tabellen-Updates oder -Löschungen werden unterstützt.
-
BLOBund Spalten vom Typ räumliche Daten können keine Verbindungsspalten in einer Hash-Verknüpfung sein.
Aktivieren von Hash-Joins
So aktivieren Sie Hash-Joins:
-
Aurora My SQL Version 2 — Stellen Sie den DB-Parameter oder den DB-Cluster-Parameter
aurora_disable_hash_join
auf ein0
. Durch Deaktivierung vonaurora_disable_hash_join
wird der Wert vonoptimizer_switch
aufhash_join=on
gesetzt. -
Aurora My SQL Version 3 — Stellen Sie den Parameter Mein SQL Server
optimizer_switch
auf einblock_nested_loop=on
.
Hash-Joins sind in Aurora My SQL Version 3 standardmäßig aktiviert und in Aurora My SQL Version 2 standardmäßig deaktiviert. Das folgende Beispiel zeigt, wie Hash-Joins für Aurora My SQL Version 3 aktiviert werden. Sie können zuerst die Anweisung select @@optimizer_switch
ausgeben, um zu sehen, welche anderen Einstellungen in der SET
-Parameterzeichenfolge vorhanden sind. Das Aktualisieren einer Einstellung im Parameter optimizer_switch
löscht oder ändert die anderen Einstellungen nicht.
mysql>
SET optimizer_switch='block_nested_loop=on';
Anmerkung
Für Aurora My SQL Version 3 ist die Hash-Join-Unterstützung in allen Nebenversionen verfügbar und standardmäßig aktiviert.
Für Aurora My SQL Version 2 ist Hash-Join-Unterstützung in allen Nebenversionen verfügbar. In Aurora My SQL Version 2 wird die Hash-Join-Funktion immer durch den aurora_disable_hash_join
Wert gesteuert.
Mit dieser Einstellung wählt der Optimierer einen Hash-Join auf der Grundlage von Kosten, Abfragemerkmalen und Ressourcenverfügbarkeit. Wenn die Kalkulation fehlerhaft ist, können Sie den Optimierer zwingen, einen bestimmten Hash-Join zu wählen. Sie tun dieshash_join_cost_based
, indem Sie eine My SQL Server-Variable auf setzenoff
. Das folgende Beispiel zeigt, wie Sie den Optimierer zwingen können, einen Hash-Join zu wählen.
mysql>
SET optimizer_switch='hash_join_cost_based=off';
Anmerkung
Diese Einstellung setzt die Entscheidungen des kostenbasierten Optimierers außer Kraft. Während die Einstellung für Tests und Entwicklung nützlich sein kann, empfehlen wir, sie nicht in der Produktion zu verwenden.
Optimieren von Abfragen für Hash-Joins
Um herauszufinden, ob eine Abfrage einen Hash-Join nutzen kann, verwenden Sie die EXPLAIN
-Anweisung, um die Abfrage zuerst zu profilieren. Die EXPLAIN
-Anweisung stellt Informationen über den Ausführungsplan bereit, der für eine angegebene Abfrage verwendet werden soll.
In der Ausgabe der EXPLAIN
-Anweisung beschreibt die Spalte Extra
zusätzliche Informationen, die im Ausführungsplan eingeschlossen sind. Wenn ein Hash-Join für die in der Abfrage verwendeten Tabellen gilt, enthält diese Spalte Werte, die den folgenden ähnlich sind:
Using where; Using join buffer (Hash Join Outer table
table1_name
)Using where; Using join buffer (Hash Join Inner table
table2_name
)
Das folgende Beispiel zeigt die Verwendung vonEXPLAIN, um den Ausführungsplan für eine Hash-Join-Abfrage anzuzeigen.
mysql>
explain SELECT sql_no_cache * FROM hj_small, hj_big, hj_big2->
WHERE hj_small.col1 = hj_big.col1 and hj_big.col1=hj_big2.col1 ORDER BY 1;+----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ | 1 | SIMPLE | hj_small | ALL | NULL | NULL | NULL | NULL | 6 | Using temporary; Using filesort | | 1 | SIMPLE | hj_big | ALL | NULL | NULL | NULL | NULL | 10 | Using where; Using join buffer (Hash Join Outer table hj_big) | | 1 | SIMPLE | hj_big2 | ALL | NULL | NULL | NULL | NULL | 15 | Using where; Using join buffer (Hash Join Inner table hj_big2) | +----+-------------+----------+------+---------------+------+---------+------+------+----------------------------------------------------------------+ 3 rows in set (0.04 sec)
In der Ausgabe ist der Hash Join Inner table
die Tabelle, die zum Aufbau der Hash-Tabelle verwendet wird, und der Hash Join Outer table
ist die Tabelle, die zum Prüfen der Hash-Tabelle verwendet wird.
Weitere Informationen zum erweiterten EXPLAIN
Ausgabeformat finden Sie unter Erweitertes EXPLAIN Ausgabeformat
In Aurora My SQL 2.08 und höher können Sie mithilfe von SQL Hinweisen beeinflussen, ob eine Abfrage einen Hash-Join verwendet oder nicht und welche Tabellen für die Build- und Test-Seite des Joins verwendet werden sollen. Details hierzu finden Sie unter Aurora Meine SQL Tipps.
Verwenden von Amazon Aurora zur Skalierung von Lesevorgängen für Ihre Meine SQL Datenbank
Sie können Amazon Aurora mit Ihrer My SQL DB-Instance verwenden, um die Vorteile der Leseskalierung von Amazon Aurora zu nutzen und den Lese-Workload für Ihre My SQL DB-Instance zu erweitern. Um Aurora für die Leseskalierung Ihrer My SQL DB-Instance zu verwenden, erstellen Sie einen Aurora My SQL DB-Cluster und machen Sie ihn zu einer Read Replica Ihrer My SQL DB-Instance. Stellen Sie dann eine Verbindung zum Aurora SQL My-Cluster her, um die Leseabfragen zu verarbeiten. Bei der Quelldatenbank kann es sich um eine RDS For My SQL DB-Instance oder um eine My SQL Database handeln, die extern zu Amazon läuftRDS. Weitere Informationen finden Sie unter Skalierung von Lesevorgängen für Ihre My SQL Database mit Amazon Aurora.
Optimierung von Zeitstempeloperationen
Wenn der Wert der Systemvariablen auf gesetzt time_zone
ist, führt jeder SQL Funktionsaufruf von MySYSTEM
, der eine Zeitzonenberechnung erfordert, einen Systembibliotheksaufruf durch. Wenn Sie SQL Anweisungen ausführen, die solche TIMESTAMP
Werte zurückgeben oder ändern, bei hoher Parallelität, kann es zu erhöhter Latenz, Sperrkonflikten und CPU erhöhter Auslastung kommen. Weitere Informationen finden Sie unter time_zone
Wir empfehlen, den Wert des DB-Cluster-Parameters time_zone
in UTC
zu ändern, um dieses Verhalten zu vermeiden. Weitere Informationen finden Sie unter Ändern von Parametern in einer DB-Cluster-Parametergruppe in Amazon Aurora.
Der Parameter time_zone
ist zwar dynamisch (er erfordert keinen Neustart des Datenbankservers), der neue Wert wird jedoch nur für neue Verbindungen verwendet. Um sicherzustellen, dass alle Verbindungen so aktualisiert werden, dass sie den neuen time_zone
-Wert verwenden, empfehlen wir, Ihre Anwendungsverbindungen nach der Aktualisierung des DB-Cluster-Parameters wiederzuverwenden.