VorwortIm Internet gibt es zahlreiche Informationen und Methoden zur Datenbankoptimierung. Allerdings ist die Qualität vieler dieser Informationen unterschiedlich, die Zusammenfassungen sind teilweise nicht gründlich und die Inhalte redundant. In diesem Artikel erhalten Sie eine detaillierte Einführung in 26 Optimierungsvorschläge. Schauen wir sie uns einmal an. 1. Versuchen Sie bei SQL-Abfragen nicht die vollständige Suche mit „select *“, sondern „select + bestimmte Felder“ zu verwenden.Gegenbeispiel: wähle * vom Studenten; Positives Beispiel: Wählen Sie ID, Name und Alter des Schülers aus; Grund:
2. Verwenden Sie vorbereitete Anweisungen für DatenbankoperationenGrund:
3. Verwenden Sie keine Insert-Anweisungen ohne Feldliste Gegenbeispiel: in Werte einfügen ('a', 'b', 'c'); Positives Beispiel: in t(a, b, c) Werte einfügen ('a', 'b', 'c'); Grund:
4. Vermeiden Sie die Verwendung von oder zum Verbinden von Bedingungen in der Where-KlauselBeispiel: Erstellen Sie eine neue Benutzertabelle mit einem gemeinsamen Index userId. Die Tabellenstruktur ist wie folgt: CREATE TABLE `Benutzer` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `user_id` int(11) NICHT NULL, `Alter` int(11) NICHT NULL, `name` varchar(30) NICHT NULL, Primärschlüssel (`id`), SCHLÜSSEL `idx_userId` (`userId`) )ENGINE=InnoDB STANDARD-CHARSET=utf8; Abfrage von Benutzern, deren Benutzer-ID 1 ist oder deren Alter 18 Jahre ist Gegenbeispiel: Wählen Sie ID, Benutzer-ID, Alter und Namen des Benutzers aus, wobei Benutzer-ID = 1 oder Alter = 18 ist. Positives Beispiel: # Verwenden von union all wähle ID, Benutzer-ID, Alter, Name vom Benutzer, bei dem Benutzer-ID=1, alles vereinige, wähle * vom Benutzer, bei dem Alter = 18 # Oder schreiben Sie zwei separate SQL-Anweisungen: select id, user_id, age, name from user where userid=1; select * from user where age = 18 Grund:
5. Wenn Sie Where-Bedingungen zum Abfragen verwenden, beschränken Sie die abzufragenden Daten, um die Rückgabe redundanter Zeilen und eine implizite Konvertierung von Datentypen zu vermeiden.Angenommen, die ID ist vom Typ int, fragen Sie die Daten mit der ID = 1 ab Gegenbeispiel: Wählen Sie ID und Name des Studenten aus, wobei ID = „1“ ist. Positives Beispiel: Wählen Sie ID und Name des Studenten aus, wobei ID = 1; Grund:
6. Führen Sie Ausdrucksoperationen oder Funktionskonvertierungen für Felder in der Where-Klausel aus. Dadurch gibt das System die Verwendung von Indizes auf und führt einen vollständigen Tabellenscan durchNehmen wir an, dass das Feld „Alter“ der Benutzertabelle indiziert ist, und fragen Sie dessen Daten ab Gegenbeispiel: Wählen Sie Name und Alter des Benutzers aus, wobei Alter - 1 = 20; Positives Beispiel: Wählen Sie Name und Alter des Benutzers aus, wobei Alter = 21 ist. Grund:
7. Vermeiden Sie möglichst die Verwendung der Operatoren != oder <> in der Where-Klausel. Andernfalls gibt die Engine die Verwendung des Indexes auf und führt einen vollständigen Tabellenscan durch.(Anwendbar in MySQL) Gegenbeispiel: Wählen Sie Alter und Namen des Benutzers aus, wobei Alter <> 18 ist. Positives Beispiel: # Sie können zwei separate SQL-Anweisungen schreiben: select age,name from user where age < 18; Wählen Sie Alter und Namen des Benutzers aus, sofern das Alter > 18 ist. Grund:
8. Zur Abfrageoptimierung sollten Sie die Erstellung von Indizes für die an „Where“ und „Order By“ beteiligten Spalten in Erwägung ziehen, um vollständige Tabellenscans möglichst zu vermeiden.Gegenbeispiel: Wählen Sie Name, Alter und Adresse des Benutzers aus, wobei Adresse = „Alter“, sortiert nach Alter; Positives Beispiel: Index hinzufügen und dann abfragen alter table user add index idx_address_age (Adresse, Alter) 9. Erwägen Sie die Verwendung von Standardwerten anstelle von Null in Where-KlauselnGegenbeispiel: (Dadurch werden alle Daten überprüft) Wählen Sie Benutzer-ID, Name und Alter des Benutzers aus, bei dem das Alter nicht null ist. Positives Beispiel: # Setzen Sie das Tabellenfeld Alter auf 0 als Standardwert statt auf null Wählen Sie Benutzer-ID, Name und Alter des Benutzers aus, bei dem das Alter > 0 ist. 1 2 Grund:
10. Wenn das Abfrageergebnis nur einen Datensatz enthält oder nur ein Datensatz benötigt wird (möglicherweise der Maximal-/Minimalwert), wird empfohlen, das Limit 1 zu verwendenAngenommen, es gibt einen Studententisch und wir möchten eine Person namens Tom finden. CREATE TABLE `student` ( `id` int(11) NICHT NULL, `name` varchar(50) DEFAULT NULL, `Alter` int(11) DEFAULT NULL, `date` Datum/Uhrzeit DEFAULT NULL, `sex` int(1) DEFAULT NULL, PRIMÄRSCHLÜSSEL (`id`) )ENGINE=InnoDB STANDARD-CHARSET=utf8mb4; Gegenbeispiel: Wählen Sie ID, Name vom Studenten, wobei Name = "Tom" Positives Beispiel Wählen Sie ID, Name vom Mitarbeiter, wobei Name = ‚Tom‘, Limit 1; Grund: Nach dem Hinzufügen der Paging-Grenze 1 wird der Scan nicht fortgesetzt, sobald ein entsprechender Datensatz gefunden wird, und die Effizienz wird erheblich verbessert. 11. Optimieren Sie Limit-Paging-AnweisungenBeim täglichen Paging verwenden wir normalerweise ein Limit, um dies zu erreichen. Wenn der Offset jedoch besonders groß ist, verringert sich die Abfrageeffizienz. Gegenbeispiel: Wählen Sie ID, Name, Alter aus dem Studentenlimit 10000,10 Positives Beispiel: # Lösung 1: Gibt den maximalen Datensatz (Offset) der letzten Abfrage zurück Wählen Sie ID und Namen des Studenten, wobei die ID > 10.000, Limit 10, ist. # Lösung 2: Sortieren nach + Index, wähle ID, Name vom Studenten, Sortieren nach ID-Limit 10000,10; # Option 3: Begrenzen Sie die Seitenzahl, sofern das Unternehmen dies zulässt: Grund:
12. Vermeiden Sie die Rückgabe zu vieler Daten an den Client und verwenden Sie Limit PagingNehmen wir an, die Geschäftsanforderung besteht darin, dass der Benutzer die Anzeige der Filmdaten anfordert, die er im letzten Jahr angesehen hat. Gegenbeispiel: # Alle Daten auf einmal abfragen select * from LivingInfo wobei watchId = useId und watchTime >= Date_sub(jetzt(),Intervall 1 J) Positives Beispiel: # Paginierungsabfrage wählen Sie * aus LivingInfo wobei watchId = useId und watchTime>= Date_sub(jetzt(),Intervall 1 J) Grenzoffset, Seitengröße # Wenn es sich um Front-End-Paging handelt, können Sie zuerst die ersten 200 Datensätze abfragen, da der durchschnittliche Benutzer nicht zu viele Seiten nach unten scrollen sollte. Wählen Sie * aus LivingInfo aus. wobei watchId = useId und watchTime>= Date_sub(jetzt(),Intervall 1 J) Grenze 200; 13. Like-Aussagen optimierenBei der unscharfen Schlüsselwortsuche mit LIKE besteht die Möglichkeit, dass LIKE den Index ungültig macht. Gegenbeispiel: Wählen Sie * aus Student WO Name WIE '%strive_day'; -- Oder verwenden Sie % zum Umschließen von SELECT * FROM student WO Name WIE '%strive_day%'; Positives Beispiel: Wählen Sie * aus Student WO Name WIE 'strive_day%'; Grund:
14. Vermeiden Sie die Verwendung integrierter MySQL-Funktionen für IndexspaltenBeispiel: Abfrage von Benutzern, die sich in den letzten sieben Tagen angemeldet haben (vorausgesetzt, das Feld loginTime ist indiziert) Gegenbeispiel: SELECT * FROM system_user Benutzer WHERE Date_ADD(Benutzer.Anmeldezeit,Intervall 7 TAGE) >= jetzt(); Positives Beispiel: SELECT * FROM system_user Benutzer WO user.loginTime >= Date_ADD(JETZT(),INTERVALL - 7 TAGE); Grund:
15. Achten Sie bei Verwendung eines gemeinsamen Index auf die Reihenfolge der Indexspalten. Befolgen Sie im Allgemeinen das Übereinstimmungsprinzip ganz linksAngenommen, es gibt einen gemeinsamen Index (Benutzer-ID, Alter), bei dem die Benutzer-ID vorne und das Alter hinten steht. Gegenbeispiel: Wählen Sie Benutzer-ID, Name und Alter des Benutzers aus, wobei Alter = 10 ist. Positives Beispiel: # Wählen Sie gemäß dem ganz links stehenden Übereinstimmungsprinzip Benutzer-ID, Name und Alter des Benutzers aus, wobei Benutzer-ID = 1 und Alter = 21 ist. # Wählen Sie gemäß dem ganz links stehenden Übereinstimmungsprinzip Benutzer-ID, Name und Alter des Benutzers aus, bei dem Benutzer-ID = 1 ist. Grund:
16. Verwenden Sie ggf. abdeckende Indizes.Durch das Abdecken von Indizes müssen Ihre SQL-Anweisungen nicht zur Tabelle zurückkehren. Sie können alle erforderlichen Daten abrufen, indem Sie einfach auf den Index zugreifen, was die Abfrageeffizienz erheblich verbessert. Gegenbeispiel: # Wie Fuzzy-Abfrage, keine Indexauswahl Benutzer-ID, Name, Alter vom Benutzer, wobei Benutzer-ID wie „%123%“ ist # Wenn die ID der Primärschlüssel ist, handelt es sich um einen normalen Index, d. h. einen überlagernden Index. Wählen Sie Benutzer-ID, Name und Alter des Benutzers aus, dessen Benutzer-ID beispielsweise „%123%“ lautet. 17. Entfernen Sie redundante und doppelte IndizesGegenbeispiel: SCHLÜSSEL `idx_userId` (`userId`) SCHLÜSSEL `idx_userId_age` (`userId`,`age`) Positives Beispiel: SCHLÜSSEL `idx_userId_age` (`userId`,`age`) # Löschen Sie den Index der Benutzer-ID (SCHLÜSSEL `idx_userId_age` (`userId`,`age`)) # Weil der kombinierte Index (A, B) gleichbedeutend mit der Erstellung der beiden Indizes (A) und (A, B) ist. Grund:
18. Inner Join, Left Join, Right Join, Inner Join wird bevorzugt. Bei Left Join sollte das Ergebnis der linken Tabelle so klein wie möglich sein.Innerer Join: Wenn zwei Tabellen für eine Abfrage verknüpft werden, werden nur die Ergebnismengen beibehalten, die vollständig mit den beiden Tabellen übereinstimmen. Wenn Left Join eine Join-Abfrage für zwei Tabellen ausführt, werden alle Zeilen der linken Tabelle zurückgegeben, auch wenn in der rechten Tabelle keine übereinstimmenden Datensätze vorhanden sind. Wenn der rechte Join eine Join-Abfrage für zwei Tabellen ausführt, werden alle Zeilen der rechten Tabelle zurückgegeben, auch wenn in der linken Tabelle keine übereinstimmenden Datensätze vorhanden sind. Unter der Voraussetzung, dass die SQL-Anforderungen erfüllt sind, ist Inner Join vorzuziehen. Bei Verwendung von Left Join sollten die Datenergebnisse der linken Tabelle möglichst klein sein und, wenn die Bedingungen es zulassen, zur Verarbeitung auf der linken Seite platziert werden. Gegenbeispiel: Wähle Name und Alter aus Tab1 t1 links und schließe dich Tab2 t2 an, auf t1.age = t2.age, wobei t1.id = 2; Positives Beispiel: Wähle Name, Alter aus (wähle * aus Tab1, wo ID = 2) t1 links, schließe dich Tab2 an, t2 an t1.Alter = t2.Alter; Grund:
19. Wenn Sie zu viele Daten einfügen, sollten Sie die Stapelverarbeitung in Betracht ziehenGegenbeispiel: für (Benutzer u: Liste) { INSERT in Benutzer(Name, Alter) Werte(Name, Alter)} Positives Beispiel: //Fügen Sie jeweils 500 Werte ein und fügen Sie sie stapelweise in die Benutzerwerte (Name, Alter) ein. <foreach Sammlung="Liste" Element="Element" Index="Index" Trennzeichen=","> (#{item.name},#{item.alter}) </foreach> Grund:
20. Verwenden Sie das Schlüsselwort „distinct“ so wenig wie möglichDas Schlüsselwort „distinct“ wird im Allgemeinen verwendet, um doppelte Datensätze herauszufiltern und nicht doppelte Datensätze zurückzugeben. Bei der Abfrage eines oder weniger Felder bringt es Optimierungseffekte für die Abfrage. Bei vielen Feldern verringert sich die Abfrageeffizienz jedoch erheblich. Gegenbeispiel: # Doppelte Felder entfernen SELECT DISTINCT * from user; Positives Beispiel: Wählen Sie einen UNTERSCHIEDLICHEN Namen vom Benutzer aus. Grund:
21. Verwenden Sie nicht mehr als 5 TabellenverknüpfungenGrund:
22. So optimieren Sie Aktualisierungsanweisungen bei großen Datenmengen.Bei großen Datenmengen muss darauf geachtet werden, dass nicht zu viele Daten gleichzeitig geändert oder gelöscht werden. Dies führt zu einer übermäßigen CPU-Auslastung und beeinträchtigt den Zugriff anderer Personen auf die Datenbank. Gegenbeispiel: # Löschen Sie 100.000 oder mehr als 1 Million Datensätze auf einmal, löschen Sie von Benutzern, bei denen die ID < 1000000 ist; # Oder verwenden Sie eine einzelne Schleifenoperation, die ineffizient und zeitaufwändig ist für (User user: list) {delete from user;} Positives Beispiel: # Löschen Sie in Stapeln, z. B. jeweils 500 Benutzer löschen, bei denen die ID < 500 ist Benutzer löschen, bei denen ID >= 500 und ID < 1000; ... Benutzer löschen, bei denen ID >= 999500 und ID < 1000000; Grund:
23. Verwenden Sie vorhanden und in angemessener WeiseAngenommen, Tabelle A stellt die Mitarbeitertabelle eines Unternehmens dar und Tabelle B die Abteilungstabelle. Die SQL-Anweisung zum Abfragen aller Mitarbeiter in allen Abteilungen lautet: Gegenbeispiel: Wählen Sie * aus A, wo deptId in (wählen Sie deptId aus B); Dies entspricht der Schreibweise:
Es kann in eine Schleifenanweisung wie diese abstrahiert werden: Liste<> Ergebnismenge; für(int i = 0; i < B.Länge; i++) { für(int j = 0; j < A.Länge; j++) { wenn(A[i].id == B[j].id) { Ergebnismenge.add(A[i]); brechen; } } } Wir können auch exists verwenden, um die gleiche Abfragefunktion zu erreichen Wählen Sie * aus A, wo vorhanden (wählen Sie 1 aus B, wo A.deptId = B.deptId);
select * from A, loop from table A first Denn das Verständnis der Exist-Abfrage besteht darin, zuerst die Hauptabfrage auszuführen, die Daten abzurufen und sie dann zur Überprüfung der Bedingungen in die Unterabfrage einzufügen. Basierend auf dem Überprüfungsergebnis (wahr oder falsch) wird bestimmt, ob das Datenergebnis der Hauptabfrage beibehalten werden kann. In ähnlicher Weise kann es in einen solchen Zyklus abstrahiert werden: Liste<> Ergebnismenge; für(int i = 0; i < A.Länge; i++) { für(int j = 0; j < B.Länge; j++) { wenn(A[i].deptId == B[j].deptId) { Ergebnismenge.add(A[i]); brechen; } } } Grund:
24. Verwenden Sie so oft wie möglich numerische Felder. Wenn das Feld nur numerische Informationen enthält, versuchen Sie, es nicht als Zeichenfeld zu gestalten.Gegenbeispiel: `king_id` varchar(20) NICHT NULL KOMMENTAR '123' Positives Beispiel: `king_id` int(11) NICHT NULL KOMMENTAR '123' Grund:
25. Versuchen Sie, union durch union all zu ersetzenWenn in den Suchergebnissen keine doppelten Datensätze vorhanden sind, wird empfohlen, „union“ durch „union all“ zu ersetzen. Gegenbeispiel: Wählen Sie * vom Benutzer aus, wobei Benutzer-ID = 1 ist. Union Wählen Sie * vom Benutzer, wobei Alter = 20 Positives Beispiel: Wählen Sie * vom Benutzer aus, wobei Benutzer-ID = 1 ist. Vereinigung alle Wählen Sie * vom Benutzer, wobei Alter = 20 Grund:
26. Wenn der Feldtyp eine Zeichenfolge ist, müssen Sie ihn bei der Verwendung von „where“ unbedingt in Anführungszeichen einschließen, da sonst der Index ungültig ist.Gegenbeispiel: Wählen Sie * vom Benutzer, wobei Benutzer-ID = 1 ist; Positives Beispiel: Wählen Sie * vom Benutzer aus, wobei Benutzer-ID = „1“ ist. Grund: Die erste Anweisung verwendet den Index nicht, wenn er nicht in einfache Anführungszeichen eingeschlossen ist. Dies liegt daran, dass ohne einfache Anführungszeichen die Zeichenfolge mit der Zahl verglichen wird und ihre Typen nicht übereinstimmen. MySQL führt eine implizite Typkonvertierung durch und konvertiert sie zum Vergleich in Gleitkommazahlen. ZusammenfassenDies ist das Ende dieses Artikels über MySQL-Optimierung und das Schreiben hochwertiger SQL-Anweisungen. Weitere relevante Inhalte zu SQL-Anweisungen zur MySQL-Optimierung 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:
|
<<: 9 Möglichkeiten zum Ein- und Ausblenden von CSS-Elementen
>>: Mehrere Methoden zum Bereitstellen mehrerer Front-End-Projekte mit nginx
Phänomen: Wandeln Sie das Div in einen Kreis, ein...
Inhaltsverzeichnis Vorwort Frage Online-Lösungen ...
Indem wir den aktuellen Bildlaufversatz zu den At...
MySQL ist einfach zu installieren, schnell und ve...
Verwenden Sie Javascript, um ein Message Board-Be...
Verwendung: Datum [Optionen]... [+Format] oder: D...
Professionelles Webdesign ist komplex und zeitint...
Zunächst einmal ist dieser Beitrag Docker-Neuling...
A. Installation des MySQL-Sicherungstools xtrabac...
Systemversion [root@ ~]# cat /etc/redhat-release ...
Laden Sie MySQL 5.7.20 / 5.7.21 herunter, install...
Inhaltsverzeichnis Eckig erreichen Aufrufreihenfo...
Mit der zunehmenden Anzahl offener Plattformen ver...
Hintergrund Dieser Fehler wurde dadurch verursach...
Der <area>-Tag wird vor allem in Imagemaps ...