1. Wählen Sie die am besten geeigneten Feldattribute Wenn Sie beispielsweise beim Definieren des Postleitzahlenfelds den Wert 2. Versuchen Sie, das Feld auf NOT NULL zu setzen Setzen Sie das Feld nach Möglichkeit auf Für einige Textfelder, wie etwa „Provinz“ oder „Geschlecht“, können wir sie als ENUM-Typ (Aufzählung) definieren. Denn in MySQL wird der ENUM-Typ wie numerische Daten behandelt und numerische Daten werden viel schneller verarbeitet als Textdaten. Auf diese Weise können wir die Leistung der Datenbank verbessern. 3. Verwenden Sie JOIN anstelle von UnterabfragenMySQL unterstützt SQL-Unterabfragen ab Version 4.1. Mit dieser Technik können Sie mithilfe einer Select-Anweisung ein einzelnes Abfrageergebnis erstellen und dieses Ergebnis dann als Filterbedingung in einer anderen Abfrage verwenden. Wenn wir beispielsweise Kunden löschen möchten, für die in der Tabelle mit den grundlegenden Kundeninformationen keine Bestellungen vorliegen, können wir mithilfe einer Unterabfrage zunächst die Kunden-IDs aller Kunden abrufen, die Bestellungen aus der Tabelle mit den Verkaufsinformationen aufgegeben haben, und das Ergebnis dann an die Hauptabfrage übergeben, wie in der folgenden Abbildung dargestellt: Wenn Sie zum Abschließen dieser Aufgabe einen JOIN verwenden, ist die Geschwindigkeit viel höher. Insbesondere wenn in der Tabelle „salesinfo“ ein Index für CustomerID vorhanden ist, ist die Leistung besser. Die Abfrage lautet wie folgt: Der Grund, warum JOIN effizienter ist, liegt darin, dass MySQL keine temporäre Tabelle im Speicher erstellen muss, um diese Abfrage abzuschließen, die logischerweise zwei Schritte erfordert. Wenn Ihre Anwendung viele JOIN-Abfragen enthält, sollten Sie außerdem sicherstellen, dass die Felder in den beiden verknüpften Tabellen indiziert sind. Auf diese Weise startet MySQL einen Mechanismus, um die JOIN-SQL-Anweisung für Sie zu optimieren. Und die für JOIN verwendeten Felder sollten vom gleichen Typ sein. Beispiel: Wenn Sie ein DECIMAL-Feld mit einem INT-Feld verknüpfen, kann MySQL deren Indizes nicht verwenden. Für diese Ein innerer WÄHLEN SIE A.id, A.name, B.id, B.name VON A LINKS MIT B AUF A.id=B.id; WÄHLEN SIE A.id, A.name, B.id, B.name AUS A RECHTS JOIN AUF B A.id= B.id; Wählen Sie A.id, A.name, B.id, B.name aus einem inneren Join auf A.id = B.id; Es wurde in vielerlei Hinsicht bestätigt, dass WÄHLEN SIE A.id, A.name, B.id, B.name AUS A, B, WO A.id = B.id; Empfehlung: Verwenden Sie wenn möglich
Beispielsweise haben wir zwei Tabellen: Wir verwenden SELECT p.Nachname, p.Vorname, o.Bestellnummer VON Personen p INNER JOIN Aufträge von ON p.Id_P=o.Id_P und 1=1 -- Verwenden Sie und , um mehrere Bedingungen zu verbinden ORDER BY p.LastName Abfrageergebnissatz: Wenn bei dieser Verbindungsmethode das Feld „Id_P“ in der Tabelle „Orders“ keine Entsprechung in der Tabelle „Persons“ findet, wird es nicht aufgelistet. Hinweis: Wenn wir jedoch zwei Tabellen verbinden:
Diese Schreibmethode entspricht jedoch nicht dem Standard und funktioniert möglicherweise nur für bestimmte Datenbanken, z. B. Der Unterschied zwischen der Inner-Join-Abfrage ( Beim Verbinden zweier Tabellen gibt Wir verwenden Left Join, um die beiden Tabellen abzufragen. Das SQL lautet wie folgt: SELECT p.Nachname, p.Vorname, o.Bestellnummer VON Personen p LEFT JOIN Aufträge o EIN p.Id_P=o.Id_P ORDER BY p.Nachname Die Abfrageergebnisse lauten wie folgt: Sie können sehen, dass das Feld Wir verwenden Right Join, um die beiden Tabellen abzufragen. Das SQL lautet wie folgt: SELECT p.Nachname, p.Vorname, o.Bestellnummer VON Personen p RIGHT JOIN Aufträge o EIN p.Id_P=o.Id_P ORDER BY p.Nachname Die Abfrageergebnisse lauten wie folgt: Der Id_P-Feldwert des letzten Datensatzes in der Tabelle „Bestellungen“ beträgt 65. In der linken Tabelle gibt es keinen passenden Datensatz, dieser wird jedoch beibehalten. Wir verwenden Full Join, um die beiden Tabellen abzufragen. Das SQL lautet wie folgt: SELECT p.Nachname, p.Vorname, o.Bestellnummer VON Personen p FULL JOIN Aufträge o EIN p.Id_P=o.Id_P ORDER BY p.Nachname Die Abfrageergebnisse lauten wie folgt: Das Abfrageergebnis ist die Vereinigungsmenge von 4. Verwenden Sie UNION anstelle manuell erstellter temporärer Tabellen MySQL unterstützt seit Version 4.0 Union-Abfragen, die zwei oder mehr Wenn wir bestätigen können, dass es keine doppelten Ergebnissätze gibt oder uns doppelte Ergebnissätze egal sind, versuchen Sie, „union all“ statt „union“ zu verwenden. Der Hauptunterschied zwischen „union“ und „union all“ besteht darin, dass ersteres zwei oder mehr Ergebnissätze zusammenführen muss, bevor eindeutige Filtervorgänge ausgeführt werden können. Dies beinhaltet das Sortieren, das Hinzufügen vieler CPU-Vorgänge, was den Ressourcenverbrauch und die Latenz erhöht. 5. Angelegenheiten Obwohl wir Stellen Sie sich vor, Sie möchten bestimmte Daten gleichzeitig in zwei verknüpfte Tabellen einfügen. Dabei kann folgende Situation eintreten: Nachdem die erste Tabelle erfolgreich aktualisiert wurde, tritt plötzlich eine unerwartete Situation in der Datenbank auf, die dazu führt, dass der Vorgang in der zweiten Tabelle nicht abgeschlossen werden kann. Dies führt zu unvollständigen Daten oder sogar zu einer Beschädigung der Daten in der Datenbank. Um diese Situation zu vermeiden, sollten Sie Transaktionen verwenden, die sicherstellen, dass jede Anweisung im Anweisungsblock entweder erfolgreich ist oder fehlschlägt. Mit anderen Worten: Die Konsistenz und Integrität der Daten in der Datenbank kann gewahrt werden. Eine Transaktion beginnt mit dem Schlüsselwort BEGIN und endet mit dem Schlüsselwort COMMIT. Wenn während dieses Zeitraums eine SQL-Anweisung fehlschlägt, kann der Rollback-Befehl die Datenbank in den Zustand vor dem Beginn wiederherstellen. BEGINNEN; INSERTINTOsalesinfoSETCustomerID=14; UPDATEinventorySETQuantity=11WHEREitem='Buch'; BEGEHEN; Eine weitere Funktion einer Transaktion besteht darin, dass sie, wenn mehrere Benutzer gleichzeitig dieselbe Datenquelle verwenden, den Benutzern durch Sperren der Datenbank einen sicheren Zugriffsmechanismus bieten kann. Auf diese Weise wird sichergestellt, dass die Vorgänge des Benutzers nicht durch andere Benutzer gestört werden. Im Allgemeinen müssen Transaktionen vier Bedingungen erfüllen (ACID):
Probleme mit der Parallelität von Transaktionen:
MySQL-Transaktionsisolierungsebenen Transaktionskontrollanweisungen:
6. Verwenden Sie FremdschlüsselMit der Sperrtabellenmethode kann die Integrität der Daten gewahrt werden, die Relevanz der Daten kann jedoch nicht garantiert werden. Zu diesem Zeitpunkt können wir Fremdschlüssel verwenden. Beispiel: Ein Fremdschlüssel kann sicherstellen, dass jeder Verkaufsdatensatz auf einen bestehenden Kunden verweist. Hier kann der Fremdschlüssel TABELLE ERSTELLEN Kundeninfo (Kunden-ID int Primärschlüssel) Engine = innodb; CREATE TABLE salesinfo(salesid int not null,customerid int not null, Primärschlüssel(customerid,salesid),Fremdschlüssel(customerid) verweist beim Löschen der Kaskade auf customerinfo(customerid))engine = innodb; Beachten Sie im Beispiel den Parameter „ 7. Tabelle sperrenObwohl Transaktionen eine sehr gute Möglichkeit darstellen, die Datenbankintegrität aufrechtzuerhalten, wirkt sich ihre Exklusivität manchmal auf die Datenbankleistung aus, insbesondere in großen Anwendungssystemen. Da die Datenbank während der Ausführung der Transaktion gesperrt ist, können andere Benutzeranforderungen nur vorübergehend warten, bis die Transaktion beendet ist. Wenn ein Datenbanksystem nur von wenigen Benutzern verwendet wird, stellen die Auswirkungen von Transaktionen kein großes Problem dar. Wenn jedoch Tausende von Benutzern gleichzeitig auf ein Datenbanksystem zugreifen, beispielsweise auf eine E-Commerce-Website, kommt es zu erheblichen Reaktionsverzögerungen. Tatsächlich können wir in manchen Fällen durch Sperren der Tabelle eine bessere Leistung erzielen. Das folgende Beispiel ist eine Methode zum Sperren einer Tabelle, um die Transaktionsfunktion im vorherigen Beispiel abzuschließen. Hier verwenden wir eine 8. Verwenden Sie Indizes Die Indizierung ist eine gängige Methode zur Verbesserung der Datenbankleistung. Sie ermöglicht es dem Datenbankserver, bestimmte Zeilen viel schneller abzurufen als ohne Index. Dies gilt insbesondere, wenn die Abfrage Befehle wie Welche Felder sollten also indiziert werden? Generell sollten Indizes für Felder erstellt werden, die für Beispielsweise das Feld " Darüber hinaus unterstützt MySQL ab Version 3.23.23 die Volltextindizierung und -suche. Der Volltextindex in MySQL ist ein Index vom Typ 9. Optimieren Sie die Abfrageanweisung9.1 Keine Unterabfragen verwenden Beispiel: In MySQL 5.5 führt der interne Ausführungsplaner die Unterabfrage folgendermaßen aus: Zuerst wird die äußere Tabelle geprüft und dann die innere Tabelle abgeglichen, anstatt zuerst die innere Tabelle t2 zu prüfen. Wenn die Daten in der äußeren Tabelle sehr groß sind, ist die Abfragegeschwindigkeit sehr langsam. In MariaDB10/MySQL5.6 wird die Join-Methode zur Optimierung verwendet. Diese SQL-Anweisung wird automatisch konvertiert in Wählen Sie t1.* aus t1, verbinden Sie t2 auf t1.id = t2.id; Beachten Sie jedoch, dass die Optimierung nur für 9.2 Funktionale Indizes vermeidenBeispiel: Da MySQL keine funktionalen Indizes wie Oracle unterstützt, wird die gesamte Tabelle direkt gescannt, selbst wenn das Feld „d“ einen Index hat. Sollte geändert werden in —–> Wählen Sie * aus t, wobei d >= '01.01.2016' ist. 9.3 OR durch IN ersetzenIneffiziente Abfrage SELECT * FROM t WHERE LOC_ID = 10 ODER LOC_ID = 20 ODER LOC_ID = 30; —–> Effiziente Abfrage Wählen Sie * aus t, wobei LOC_IN in (10,20,30) ist. 9.4 LIKE Doppelprozentzeichen kann keinen Index verwendenWählen Sie * aus t, wobei Name wie '%de%' ist; —–> Wählen Sie * aus t, wobei Name wie 'de%' lautet; Derzeit unterstützt nur MySQL 5.7 die Volltextindizierung (unterstützt Chinesisch) 9.5 Lesen Sie die entsprechenden Datensätze LIMIT M,NWÄHLEN SIE * VON t, WO 1; —–> WÄHLEN SIE * VON t, WO 1 LIMIT 10 ist; 9.6 Vermeidung von DatentypinkonsistenzenWählen Sie * aus t, wobei id = '19' ist; —–> Wählen Sie * aus t, wobei id = 19 ist. 9.7 Gruppenstatistiken können das Sortieren verhindernWählen Sie Waren-ID, Anzahl (*) aus. Wählen Sie GRUPPE NACH Waren-ID; Standardmäßig sortiert MySQL alle Felder in —–> Wählen Sie Waren-ID, Anzahl (*) aus. Wählen Sie aus t eine Gruppe nach Waren-ID aus. Bestellen Sie nach NULL. 9.8 Zufälliges Abrufen von Datensätzen vermeidenWählen Sie * aus t1, wobei 1 = 1 bestellen nach Rand () Limit 4; MySQL unterstützt keine funktionalen Indizes, was zu einem vollständigen Tabellenscan führt—–> Wählen Sie * aus t1, wobei ID >= CEIL (RAND() * 1000) LIMIT 4 ist; 9.9 Unnötige ORDER BY-Sortierungen vermeidenSELECT Anzahl(1) FROM Benutzer u LEFT JOIN Benutzerinfo i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC; —–> SELECT Anzahl(1) FROM Benutzer u LEFT JOIN Benutzerinfo i ON u.id = i.user_id; 9.10 Stapel-INSERTINSERT INTO t (id, name) VALUES(1,'Bea'); INSERT INTO t (id, name) VALUES(2,'Belle'); INSERT INTO t (id, name) VALUES(3,'Bernice'); —–> INSERT INTO t (id, name) VALUES(1,'Bea'), (2,'Belle'),(3,'Bernice'); Damit ist dieser Artikel über 9 Techniken zur Optimierung von MySQL-Datenbanken abgeschlossen. Weitere Techniken zur Optimierung von MySQL-Datenbanken finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
>>: Lösung für das Problem, dass das Hintergrundbild eines Etiketts im IE8 nicht angezeigt wird
Umfeld: MAC_OS 10.12 Python 3.6 MySQL 5.7.25 Djan...
Dieser Artikel stellt die Entwicklungsumgebung vo...
Inhaltsverzeichnis Vorwort: 1. Einführung in Navi...
<br />In meiner jahrelangen professionellen ...
<br /> Im ersten und zweiten Teil haben wir ...
Inhaltsverzeichnis Geschäftslogik Datentabellenst...
Inhaltsverzeichnis 1. Schritte 1. Definieren Sie ...
Inhaltsverzeichnis Manipulationssicheres Javascri...
Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...
Problembeschreibung Wenn VMware Workstation eine ...
Ursache Der Grund für das Schreiben dieses Blogs ...
In diesem Artikel wird der spezifische Code von j...
Dies ist mein erster Blog. Ich bin seit zwei Jahr...
Eine einfache Nummernschild-Eingabekomponente (vu...
Inhaltsverzeichnis 1. Mehrere Syntaxen von Insert...