Vorwort In diesem Artikel erfahren Sie hauptsächlich die allgemeinen Schritte zur Optimierung von SQL-Anweisungen. Er dient zu Ihrer Information und zum Lernen. Werfen wir ohne weitere Umschweife einen Blick auf die ausführliche Einführung. 1. Verwenden Sie den Befehl „show status“, um die Ausführungshäufigkeit verschiedener SQL-Anweisungen zu verstehen Nachdem die Verbindung zum MySQL-Client erfolgreich hergestellt wurde, können Sie mit
# Com_xxx gibt an, wie oft jede xxx-Anweisung ausgeführt wird. mysql> Status wie „Com_%“ anzeigen; Normalerweise interessieren uns eher die folgenden statistischen Parameter:
Die oben genannten Parameter werden für Tabellenoperationen aller Speicher-Engines akkumuliert. Die folgenden Parameter gelten nur für InnoDB und der Akkumulationsalgorithmus ist geringfügig anders:
Anhand der oben genannten Parameter können Sie leicht erkennen, ob die aktuelle Datenbankanwendung hauptsächlich auf Einfüge-, Aktualisierungs- oder Abfragevorgängen basiert, und das ungefähre Ausführungsverhältnis verschiedener SQL-Typen ermitteln. Die Anzahl der Aktualisierungsvorgänge ist die Anzahl der Ausführungen, die akkumuliert wird, unabhängig davon, ob ein Commit oder ein Rollback ausgeführt wird. Bei transaktionalen Anwendungen können Darüber hinaus helfen die folgenden Parameter den Benutzern, die grundlegende Situation der Datenbank zu verstehen:
2. Definieren Sie SQL-Anweisungen mit geringer Ausführungseffizienz 1. Verwenden Sie das langsame Abfrageprotokoll, um SQL-Anweisungen mit geringer Ausführungseffizienz zu finden. Wenn mysqld mit 2. Das langsame Abfrageprotokoll wird erst aufgezeichnet, nachdem die Abfrage abgeschlossen ist. Wenn die Anwendung daher ein Problem mit der Ausführungseffizienz anzeigt, kann das langsame Abfrageprotokoll das Problem nicht lokalisieren. Mit dem Befehl „show processlist“ können Sie die aktuellen MySQL-Threads anzeigen, einschließlich des Thread-Status, ob die Tabelle gesperrt ist usw. Sie können den Ausführungsstatus von SQL in Echtzeit anzeigen und einige Tabellensperrvorgänge optimieren. 3. Analysieren Sie den Ausführungsplan von ineffizientem SQL durch Erläuterung Adresse der Testdatenbank: https://downloads.mysql.com/docs/sakila-db.zip (lokaler Download) Um den Gesamtbetrag zu berechnen, der per E-Mail für die Ausleihe von Filmkopien bezahlt wurde, müssen Sie die Kundentabelle customer und die Zahlungstabelle payment verknüpfen und eine Summenoperation für das Betragsfeld ausführen. Der entsprechende Ausführungsplan lautet wie folgt: mysql> erklären select sum(amount) from customer a , payment b where a.customer_id= b.customer_id and a.email='[email protected]'\G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: eine Partitionen: NULL Typ: ALLE mögliche Schlüssel: PRIMARY Schlüssel: NULL key_len: NULL Ref: NULL Reihen: 599 gefiltert: 10.00 Extra: Verwenden von „where“ *************************** 2. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: b Partitionen: NULL Typ: ref mögliche Schlüssel: idx_fk_customer_id Schlüssel: idx_fk_customer_id Schlüssellänge: 2 Referenz: sakila.a.customer_id Reihen: 26 gefiltert: 100,00 Extra: NULL 2 Zeilen im Satz, 1 Warnung (0,00 Sek.)
1. mysql> erklären select * from film where rating > 9 \G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: Film Partitionen: NULL Typ: ALLE mögliche Schlüssel: NULL Schlüssel: NULL key_len: NULL Ref: NULL Reihen: 1000 gefiltert: 33,33 Extra: Verwenden von „where“ 1 Zeile im Satz, 1 Warnung (0,01 Sek.) 2. mysql> erklären wählen Sie Titel Form Film\G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: Film Partitionen: NULL Typ: Index mögliche Schlüssel: NULL Schlüssel: idx_title Schlüssellänge: 767 Ref: NULL Reihen: 1000 gefiltert: 100,00 Extra: Index verwenden 1 Zeile im Satz, 1 Warnung (0,00 Sek.) 3. mysql> erklären select * from payment where customer_id >= 300 und customer_id <= 350 \G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: Zahlung Partitionen: NULL Typ: Bereich mögliche Schlüssel: idx_fk_customer_id Schlüssel: idx_fk_customer_id Schlüssellänge: 2 Ref: NULL Reihen: 1350 gefiltert: 100,00 Extra: Indexbedingung verwenden 1 Zeile im Satz, 1 Warnung (0,07 Sek.) 4. mysql> erklären select * from payment where customer_id = 350 \G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: Zahlung Partitionen: NULL Typ: ref mögliche Schlüssel: idx_fk_customer_id Schlüssel: idx_fk_customer_id Schlüssellänge: 2 Verweis: const Reihen: 23 gefiltert: 100,00 Extra: NULL 1 Zeile im Satz, 1 Warnung (0,01 Sek.) Der Index mysql> erklären select b.*, a.* from Zahlung a,Kunde b wobei a.customer_id = b.customer_id \G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: b Partitionen: NULL Typ: ALLE mögliche Schlüssel: PRIMARY Schlüssel: NULL key_len: NULL Ref: NULL Reihen: 599 gefiltert: 100,00 Extra: NULL *************************** 2. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: eine Partitionen: NULL Typ: ref mögliche Schlüssel: idx_fk_customer_id Schlüssel: idx_fk_customer_id Schlüssellänge: 2 Referenz: sakila.b.customer_id Reihen: 26 gefiltert: 100,00 Extra: NULL 2 Zeilen im Satz, 1 Warnung (0,00 Sek.) 5. mysql> erklären select * from film a , film_text b where a.film_id = b.film_id \G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: b Partitionen: NULL Typ: ALLE mögliche Schlüssel: PRIMARY Schlüssel: NULL key_len: NULL Ref: NULL Reihen: 1000 gefiltert: 100,00 Extra: NULL *************************** 2. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: eine Partitionen: NULL Typ: eq_ref mögliche Schlüssel: PRIMARY Schlüssel: PRIMARY Schlüssellänge: 2 Referenz: sakila.b.film_id Reihen: 1 gefiltert: 100,00 Extra: Verwenden von „where“ 2 Zeilen im Satz, 1 Warnung (0,03 Sek.) 6. mysql> Tabelle test_const erstellen ( -> test_id int, -> test_context varchar(10), -> Primärschlüssel (`test_id`), -> ); in test_const-Werte einfügen (1, „Hallo“); erkläre select * from ( select * from test_const where test_id=1 ) a \G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: test_const Partitionen: NULL Typ: const mögliche Schlüssel: PRIMARY Schlüssel: PRIMARY Schlüssellänge: 4 Verweis: const Reihen: 1 gefiltert: 100,00 Extra: NULL 1 Zeile im Satz, 1 Warnung (0,00 Sek.) 7. mysql> erklären select 1 from dual where 1 \G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: NULL Partitionen: NULL Typ: NULL mögliche Schlüssel: NULL Schlüssel: NULL key_len: NULL Ref: NULL Zeilen: NULL gefiltert: NULL Extra: Keine Tabellen verwendet 1 Zeile im Satz, 1 Warnung (0,00 Sek.) Der Typ type hat andere Werte, wie etwa
Befehl „Warnungen anzeigen“ Führen Sie nach der Ausführung von „explain“ MySQL [sakila]> erklären Sie „select sum(amount) from customer a , payment b where 1=1 and a.customer_id = b.customer_id and email = '[email protected]'\G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: eine Partitionen: NULL Typ: ALLE mögliche Schlüssel: PRIMARY Schlüssel: NULL key_len: NULL Ref: NULL Reihen: 599 gefiltert: 10.00 Extra: Verwenden von „where“ *************************** 2. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: b Partitionen: NULL Typ: ref mögliche Schlüssel: idx_fk_customer_id Schlüssel: idx_fk_customer_id Schlüssellänge: 2 Referenz: sakila.a.customer_id Reihen: 26 gefiltert: 100,00 Extra: NULL 2 Zeilen im Satz, 1 Warnung (0,00 Sek.) MySQL [sakila]> Warnungen anzeigen; +-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Ebene | Code | Nachricht | +-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Hinweis | 1003 | /* Auswahl Nr. 1 */ Auswahl von Summe(`sakila`.`b`.`Betrag`) als `Summe(Betrag)` von `sakila`.`Kunde` `a` Verbindung zu `sakila`.`Zahlung` `b`, wobei ((`sakila`.`b`.`Kunden-ID` = `sakila`.`a`.`Kunden-ID`) und (`sakila`.`a`.`E-Mail` = '[email protected]')) | +-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 Zeile im Satz (0,00 Sek.) Aus dem Warnmeldungsfeld können wir ersehen, dass der Optimierer automatisch die Bedingung entfernt, dass 1=1 immer gilt. Mit anderen Worten: Der Optimierer entfernt automatisch die Bedingung, die beim Umschreiben von SQL immer gilt. Der Befehl „explain“ unterstützt auch Partitionen. MySQL [sakila]> CREATE TABLE `customer_part` ( -> `customer_id` smallint(5) unsigniert NOT NULL AUTO_INCREMENT, -> `store_id` tinyint(3) unsigned NICHT NULL, -> `Vorname` varchar(45) NICHT NULL, -> `Nachname` varchar(45) NICHT NULL, -> `E-Mail` varchar(50) DEFAULT NULL, -> `address_id` smallint(5) unsigned NICHT NULL, -> `aktiv` tinyint(1) NICHT NULL STANDARD '1', -> `create_date` Datum/Uhrzeit NICHT NULL, -> `last_update` Zeitstempel NULL DEFAULT CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP, -> PRIMÄRSCHLÜSSEL (`customer_id`) -> ->) Partition nach Hash (Kunden-ID), Partitionen 8; Abfrage OK, 0 Zeilen betroffen (0,06 Sek.) MySQL [sakila]> in Kundenteil einfügen, auswählen * vom Kunden; Abfrage OK, 599 Zeilen betroffen (0,06 Sek.) Datensätze: 599 Duplikate: 0 Warnungen: 0 MySQL [sakila]> erklären Sie select * from customer_part where customer_id=130\G *************************** 1. Reihe *************************** ID: 1 select_type: EINFACH Tabelle: Kundenteil Partitionen: p2 Typ: const mögliche Schlüssel: PRIMARY Schlüssel: PRIMARY Schlüssellänge: 2 Verweis: const Reihen: 1 gefiltert: 100,00 Extra: NULL 1 Zeile im Set, 1 Warnung (0,00 Sek.) Sie können sehen, dass die Partition, auf die SQL zugreift, p2 ist. 4. Analysieren Sie die SQL-Leistung über performance_schema Ältere MySQL-Versionen können Profile zur Analyse der SQL-Leistung verwenden. Ich verwende Version 5.7.18, die die Verwendung von Profilen nicht mehr zulässt. Es wird empfohlen, 5. Analysieren Sie mithilfe der Ablaufverfolgung, wie der Optimierer den Ausführungsplan auswählt. MySQL 5.6 bietet eine Ablaufverfolgungsfunktion für SQL-Anweisungen, die uns helfen kann, besser zu verstehen, warum der Optimierer Ausführungsplan A anstelle von Ausführungsplan B wählt, und uns helfen kann, das Verhalten des Optimierers besser zu verstehen. Verwendung: Öffnen Sie zuerst die Ablaufverfolgung, stellen Sie das Format auf JSON ein und legen Sie die maximale Speichergröße fest, die die Ablaufverfolgung verwenden kann, um die unvollständige Anzeige während des Analysevorgangs aufgrund eines zu kleinen Standardspeichers zu vermeiden. MySQL [hinzugefügt]> set optimizer_trace="enabled=on",end_markers_in_json=on; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) MySQL [hinzugefügt]> setze optimizer_trace_max_mem_size=1000000; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) Führen Sie als Nächstes die SQL-Anweisung aus, die Sie verfolgen möchten, um beispielsweise die Datensätze der Filmkopie mit der Inventarnummer inventory_id 4466 in der Verleihtabelle „rental“ zu ermitteln, die zwischen dem Verleihdatum „rental_date“ vom 25.05.2005 zwischen 4:00:00 und 5:00:00 Uhr vermietet wurde: mysql> wähle „rental_id“ aus „rental“, wobei 1=1 und „rental_date“ >= „25.05.2005 04:00:00“ und „rental_date“ <= „25.05.2005 05:00:00“ und „inventory_id“=4466; +-------------+ | Miet-ID | +-------------+ | 39 | +-------------+ 1 Zeile im Satz (0,06 Sek.) MySQL [hinzugefügt]> select * from information_schema.optimizer_trace\G *************************** 1. Reihe *************************** ABFRAGE: select * from infomation_schema.optimizer_trace VERFOLGEN: { "Schritte": [ ] /* Schritte */ } MISSING_BYTES_BEYOND_MAX_MEM_SIZE: 0 Unzureichende Berechtigungen: 0 1 Zeile im Satz (0,00 Sek.) 6. Identifizieren Sie das Problem und ergreifen Sie entsprechende Optimierungsmaßnahmen Nach den oben genannten Schritten kann die Ursache des Problems grundsätzlich bestätigt werden. Zu diesem Zeitpunkt können je nach Situation geeignete Maßnahmen ergriffen werden, um die Ausführungseffizienz zu optimieren und zu verbessern. Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels Ihnen bei Ihrem Studium oder Ihrer Arbeit helfen kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
>>: CocosCreator ScrollView-Optimierungsreihe: Frame-Laden
<br />In Gästebüchern, Foren und anderen Ort...
1. Übersicht Die Datenbank information_schema ist...
Inhaltsverzeichnis Produktanforderungen Ideen Pro...
1. Von der offiziellen Website herunterladen und ...
Inhaltsverzeichnis 1. Nutzung 2. Ausgabeergebniss...
Der automatische Bildlaufeffekt der Seite kann du...
Inhaltsverzeichnis 1. Grundprinzipien 2. Spezifis...
Im Allgemeinen können wir beim Herunterladen von ...
1. Übersicht über Dateiberechtigungen und Eigentu...
1. Einführung in Nginx Nginx ist ein Webserver, d...
Aus historischen Gründen basiert die MySQL-Replik...
Code der Front-End-Testseite: <Vorlage> <...
JSONObject ist lediglich eine Datenstruktur, die ...
Inhaltsverzeichnis Strukturelle Vererbung (implem...
Detaillierte Erklärung der Rolle statischer Varia...