1. Allgemeine Schritte zur SQL-OptimierungLokalisieren Sie SQL-Anweisungen mit geringer Ausführungseffizienz, indem Sie Protokolle usw. langsam überprüfen. 1. Erklären Sie die Analyse des SQL-Ausführungsplans Sie müssen besonders Von oben nach unten tippen, die Effizienz wird immer höher
Obwohl die Effizienz von oben nach unten immer höher wird, lautet das SQL gemäß dem Kostenmodell: Angenommen, es gibt zwei Indizes idx1 (a, b, c) und idx2 (a, c). Dann lautet es „select * from t where a = 1 and b in (1, 2) order by c“; wenn idx1 verwendet wird, ist der Typ range, wenn idx2 verwendet wird, ist der Typ ref; wenn die Anzahl der zu scannenden Zeilen etwa fünfmal größer als idx1 ist, wird idx1 verwendet, andernfalls wird idx2 verwendet. Extra
2. Profilanalyse anzeigen Informieren Sie sich über den Status von SQL-Ausführungsthreads und die dafür benötigte Zeit. PROFILE ANZEIGEN; PROFIL FÜR ABFRAGE #{id} ANZEIGEN; 3. SpurDer Trace-Analysator verwendet die Trace-Datei, um zu analysieren, wie der Optimierer einen Ausführungsplan auswählt. Die Trace-Datei kann verwendet werden, um besser zu verstehen, warum der Coupon Ausführungsplan A statt Ausführungsplan B auswählt. Setzen Sie optimizer_trace="enabled=on"; setze optimizer_trace_max_mem_size=1000000; Wählen Sie * aus information_schema.optimizer_trace; 4. Identifizieren Sie das Problem und ergreifen Sie entsprechende Maßnahmen
2. Szenarioanalyse (Fallstudie)1. Ganz linke ÜbereinstimmungIndex SCHLÜSSEL `idx_shopid_orderno` (`shop_id`,`order_no`) SQL-Anweisungen Wählen Sie * aus _t, wobei Bestellnummer = '' Die Abfrage wird von links nach rechts gematcht. Um den Index order_no zu verwenden, muss die Abfragebedingung shop_id enthalten oder der Index (shop_id, order_no) muss vertauscht werden. 2. Implizite KonvertierungIndex SCHLÜSSEL `idx_mobile` (`mobile`) SQL-Anweisungen Wählen Sie * von _user, wobei mobile=12345678901 Eine implizite Konvertierung ist gleichbedeutend mit der Durchführung von Operationen am Index, die den Index ungültig machen. Mobile ist ein Zeichentyp. Wenn eine Zahl verwendet wird, sollte eine Zeichenfolgenübereinstimmung verwendet werden. Andernfalls verwendet MySQL implizite Ersetzung, was zu einem Indexfehler führt. 3. Große SeitenIndex SCHLÜSSEL `idx_a_b_c` (`a`, `b`, `c`) SQL-Anweisungen wähle * aus _t, wobei a = 1 und b = 2, sortiere nach c, desc-Limit 10000, 10; Bei umfangreichen Paging-Szenarien können Sie die Produktoptimierungsanforderungen priorisieren. Wenn keine Optimierung erfolgt, gibt es zwei Optimierungsmethoden: Eine Methode besteht darin, das letzte Datenstück, also das oben genannte c, zu übergeben und dann eine „ Eine andere Methode besteht darin, die SQL-Tabellenrückgabe durch verzögerte Zuordnung zu reduzieren. Denken Sie jedoch daran, dass der Index vollständig abgedeckt sein muss, um wirksam zu sein. Die SQL-Änderungen sind wie folgt wähle t1.* aus _t t1, (wähle ID aus _t, wobei a = 1 und b = 2, sortiere nach c, Beschreibungsgrenze 10000, 10) t2, wobei t1.id = t2.id; 4. in + sortieren nachIndex SCHLÜSSEL `idx_shopid_status_created` (`shop_id`, `order_status`, `created_at`) SQL-Anweisungen wähle * aus _order, wobei shop_id = 1 und order_status in (1, 2, 3) sortieren nach created_at desc limit 10 Im zugrunde liegenden MySQL sucht die Lösung: Sie können 5. Bereichsabfrage ist blockiert und nachfolgende Felder können nicht indiziert werdenIndex SCHLÜSSEL `idx_shopid_created_status` (`shop_id`, `created_at`, `order_status`) SQL-Anweisungen Wählen Sie * aus _order, wobei shop_id = 1 und created_at > '2021-01-01 00:00:00' und order_status = 10 Bereichsabfragen umfassen auch " 6. Ungleich, nicht enthalten, schnelle Suche, die keine Indizes verwenden kannICP kann verwendet werden wähle * aus _order, wobei shop_id=1 und order_status nicht in (1,2) Wählen Sie * aus _order, wobei shop_id=1 und order_status != 1 Vermeiden Sie die Verwendung 7. Wenn der Optimierer sich entscheidet, keinen Index zu verwenden Wenn die Datenmenge, auf die zugegriffen werden muss, gering ist, wählt der Optimierer dennoch den Hilfsindex. Wenn die zugegriffenen Daten jedoch einen großen Teil der Daten in der gesamten Tabelle ausmachen (normalerweise etwa Wählen Sie * aus _order, wobei order_status = 1 ist. Abfrage aller unbezahlten Bestellungen. Im Allgemeinen gibt es sehr wenige solcher Bestellungen, sodass ein Index, selbst wenn er erstellt wird, nicht verwendet werden kann. 8. Komplexe AbfragenWählen Sie Summe(amt) aus _t, wobei a = 1 und b in (1, 2, 3) und c > „2020-01-01“; wähle * aus _t, wobei a = 1 und b in (1, 2, 3) und c > '2020-01-01', Grenze 10; Wenn Sie bestimmte Daten zählen müssen, können Sie zur Lösung des Problems ein Data Warehouse verwenden. Wenn die Geschäftsabfrage so komplex ist, empfiehlt es sich möglicherweise nicht, weiterhin SQL zu verwenden, sondern andere Methoden zur Lösung zu nutzen, beispielsweise ES. 9. Asc und Desc mischenwähle * aus _t, wobei a=1, sortiere nach b desc, c asc Das Mischen von desc und asc führt zu Indexfehlern 10. Große DatenBei der Datenspeicherung von Push-Diensten kann die Datenmenge sehr groß sein. Wenn Sie sich für eine Lösung entscheiden, können Sie sich eventuell dafür entscheiden, sie auf MySQL zu speichern und für eine Gültigkeitsdauer von 7 Tagen zu speichern. Dann müssen Sie darauf achten , dass häufiges Bereinigen der Daten zu einer Datenfragmentierung führt und Sie müssen sich zur Behebung der Datenfragmentierung an den DBA wenden. Damit ist dieser Artikel über die 10 wichtigsten klassischen MySQL-Optimierungsszenarien abgeschlossen. Weitere relevante MySQL-Optimierungsszenarien finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
MySQL kann nicht nur über das Netzwerk, sondern a...
Inhaltsverzeichnis VMware BurpSuite 1. Virtuelles...
1. Installieren Sie Abhängigkeitspakete yum -y in...
1. Was ist Master-Slave-Replikation? Die DDL- und...
Über Ereignisse: MySQL 5.1 hat begonnen, das Konz...
MySQL Slow Query, dessen vollständiger Name „Slow...
Problembeschreibung Da wir uns nicht lange bei Za...
Wenn Sie Erfahrung in der Vue2-Projektentwicklung...
Inhaltsverzeichnis Vorwort 1. Neue Partitionen vo...
Inhaltsverzeichnis Namespaces mit gleichem Namen ...
Dieser Artikel zeigt anhand eines Beispiels, wie ...
Inhaltsverzeichnis 1. Einführung in MHA 1. Was is...
Ubuntu 18.04 installiert MySQL 5.7 zu Ihrer Infor...
1. Verwenden Sie den Curl-Befehl für den Standard...
Inhaltsverzeichnis 1. Geben Sie unterschiedliche ...