Heim >Datenbank >MySQL-Tutorial >Anhand von Beispielen erfahren Sie, wie Sie SQL optimieren
Obwohl die Hardwarekosten heutzutage gesunken sind, ist die Verbesserung der Systemleistung durch ein Upgrade der Hardware auch eine gängige Optimierungsmethode. Systeme mit hohen Echtzeitanforderungen müssen noch unter SQL-Gesichtspunkten optimiert werden. Heute stellen wir anhand von Beispielen vor, wie man SQL optimiert.
Sie können anhand von zwei Symptomen beurteilen, ob ein Problem mit SQL vorliegt:
Symptome auf Systemebene
Der CPU-Verbrauch ist schwerwiegend. IO-Warten ist schwerwiegend. Die Seite Die Antwortzeit ist zu lang. Wenn das Protokoll einer langen
Anwendung eine Zeitüberschreitung und andere Fehler
Lang
Die Ausführungszeit ist zu lang.
Daten aus dem vollständigen Tabellenscan abrufen. Die Zeilen und Kosten im Ausführungsplan sind sehr groß
Bei weniger Indizes werden Abfragen langsamer; Nehmen Sie mehr Platz ein und Sie müssen den Index dynamisch verwalten, wenn Sie Hinzufügungen, Löschungen und Änderungen ausführen. Die Auswahlrate ist hoch (weniger doppelte Werte) und wird häufig von den B-Tree-Indizes benötigt
UNION ALL hat eine höhere Ausführungseffizienz als UNION, und UNION muss bei der Ausführung dedupliziert werden. UNION muss Daten sortieren
Im Allgemeinen werden JOIN-Felder im Voraus indiziert.• Vermeiden Sie komplexe SQL-Anweisungen.
Verbessern Sie die Lesbarkeit. Vermeiden Sie die Wahrscheinlichkeit langsamer Abfragen , Verarbeiten Sie es mit der geschäftlichen Seite
• Vermeiden Sie die Schreibweise „order by rand()“• Vermeiden Sie die Schreibweise „1=1“
RAND(), die dazu führt, dass die Datenspalte mehrmals gescannt wirdSQL-Optimierung Ausführungsplan
Abgeschlossen Bei der Optimierung von SQL müssen Sie zunächst den Ausführungsplan lesen. Der Ausführungsplan zeigt Ihnen, wo die Effizienz gering ist und wo eine Optimierung erforderlich ist. Nehmen wir MYSQL als Beispiel, um zu sehen, wie der Ausführungsplan aussieht. (Der Ausführungsplan jeder Datenbank ist unterschiedlich, Sie müssen ihn selbst verstehen)
Feld | Erläuterung |
---|---|
ID | Jede unabhängig ausgeführte Vorgangsidentifikation identifiziert die Reihenfolge, in der das Objekt ausgeführt wird. Je größer der ID-Wert, desto größer ist der Wert, der zuerst ausgeführt wird. Die Ausführungsreihenfolge ist von oben nach unten. Unten |
select_type | Der Typ jeder Select-Klausel in der Abfrage |
table | Der Name des Objekts, an dem gearbeitet wird, normalerweise der Tabellenname, aber es gibt auch andere Formate |
Partitionen | Die passenden Partitionsinformationen (Für nicht partitionierte Tabellen ist der Wert NULL) |
Typ | Typ der Join-Operation |
mögliche_Schlüssel | mögliche Indizes |
Schlüssel | Der tatsächlich vom Optimierer verwendete Index (die wichtigste Spalte). Die Join-Typen vom besten zum schlechtesten sind const, eq_reg, ref, range, index und ALL. Wenn ALL angezeigt wird, bedeutet dies, dass das aktuelle SQL einen „schlechten Geruch“ hat. |
key_len | Die Länge des vom Optimierer ausgewählten Indexschlüssels, die Einheit ist Bytes Das betriebene Objekt in dieser Zeile, das Nicht-Referenzobjekt ist NULL |
rows | Die Anzahl der von der Abfrageausführung gescannten Tupel (für Innodb ist dieser Wert eine Schätzung) |
gefiltert | Die Anzahl der Tupel in der Bedingungstabelle, in der die Daten gefiltert werden Prozent |
extra | Wichtige Zusatzinformationen des Ausführungsplans. Seien Sie vorsichtig, wenn in dieser Spalte die Wörter „Filesort verwenden“ und „Temporär verwenden“ angezeigt werden. Es ist sehr wahrscheinlich, dass die SQL-Anweisung dies tun muss optimiert werden |
Als nächstes verwenden wir einen praktischen Optimierungsfall, um den SQL-Optimierungsprozess und die Optimierungstechniken zu erläutern. | Optimierungsfall |
CREATE TABLE `a` ( `id` int(11) NOT NULLAUTO_INCREMENT, `seller_id` bigint(20) DEFAULT NULL, `seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `gmt_create` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `b` ( `id` int(11) NOT NULLAUTO_INCREMENT, `seller_name` varchar(100) DEFAULT NULL, `user_id` varchar(50) DEFAULT NULL, `user_name` varchar(100) DEFAULT NULL, `sales` bigint(20) DEFAULT NULL, `gmt_create` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `c` ( `id` int(11) NOT NULLAUTO_INCREMENT, `user_id` varchar(50) DEFAULT NULL, `order_id` varchar(100) DEFAULT NULL, `state` bigint(20) DEFAULT NULL, `gmt_create` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) );
Drei Tabellen beziehen sich darauf, den Bestellstatus des aktuellen Benutzers 10 Stunden vor und nach der aktuellen Zeit abzufragen und sie in aufsteigender Reihenfolge entsprechend der Auftragserstellungszeit zu sortieren wie folgt
select a.seller_id, a.seller_name, b.user_name, c.state from a, b, c where a.seller_name = b.seller_name and b.user_id = c.user_id and c.user_id = 17 and a.gmt_create BETWEEN DATE_ADD(NOW(), INTERVAL – 600 MINUTE) AND DATE_ADD(NOW(), INTERVAL 600 MINUTE) order by a.gmt_create;
Da zwischen Tabelle b und Tabelle c eine Zuordnung besteht, erstellen Sie einen Index für die Benutzer-ID von Tabelle b und Tabelle c.
Da zwischen Tabelle a und Tabelle b eine Zuordnung besteht, erstellen Sie einen Index für den Verkäufernamen Feld von Tabelle a und b
Verwenden Sie einen zusammengesetzten Index. Eliminieren Sie temporäre Tabellen und Sortierung.Optimieren Sie zunächst SQL.
alter table b modify `user_id` int(10) DEFAULT NULL; alter table c modify `user_id` int(10) DEFAULT NULL; alter table c add index `idx_user_id`(`user_id`); alter table b add index `idx_user_id_sell_name`(`user_id`,`seller_name`); alter table a add index `idx_sellname_gmt_sellid`(`gmt_create`,`seller_name`,`seller_id`);
Sehen Sie sich die Ausführungszeit nach der Optimierung an Warninformationen anzeigen
ZusammenfassungWenn der Optimierungseffekt nicht offensichtlich ist, wiederholen Sie den Vorgang der vierte Schritt
Verwandte Empfehlungen: „
MySQL-Tutorial“
Das obige ist der detaillierte Inhalt vonAnhand von Beispielen erfahren Sie, wie Sie SQL optimieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!