". Vermeiden Sie die Verwendung von oder zum Anschließen von Bedingungen 3. Verwenden Sie in und nicht in mit Vorsicht."/> ". Vermeiden Sie die Verwendung von oder zum Anschließen von Bedingungen 3. Verwenden Sie in und nicht in mit Vorsicht.">

Heim  >  Artikel  >  Datenbank  >  Wie führt MySQL eine SQL-Optimierung durch?

Wie führt MySQL eine SQL-Optimierung durch?

青灯夜游
青灯夜游Original
2020-09-27 17:37:2710484Durchsuche

MySQL-SQL-Optimierungsmethoden: 1. Vermeiden Sie vollständige Tabellenscans und erstellen Sie Indizes für die beteiligten Spalten in „Where“ und „Ordnung nach“. 2. Vermeiden Sie Nullwerturteile für Felder in der Where-Klausel und vermeiden Sie die Verwendung von „!=" oder „7b16a7132ac8ac70dbba14301107690e"-Operator, vermeiden Sie die Verwendung von oder zum Verbinden von Bedingungen; 3. Verwenden Sie in und nicht in mit Vorsicht.

Wie führt MySQL eine SQL-Optimierung durch?

Gemeinsame Optimierungsstrategien für SQL in MySQL

1 Vollständigen Tabellenscan vermeiden

Um die Abfrage zu optimieren, sollten Sie zunächst überlegen, wo und nach welcher Reihenfolge beteiligt Erstellen Sie einen Index für die Spalte.

2 Vermeiden Sie die Beurteilung von Nullwerten
Sie sollten versuchen, die Beurteilung von Nullwerten für Felder in der Where-Klausel zu vermeiden, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt, z. B.:

select id from t where num is null

Kann für num verwendet werden. Legen Sie den Standardwert 0 fest, stellen Sie sicher, dass in der Num-Spalte der Tabelle kein Nullwert vorhanden ist, und fragen Sie dann wie folgt ab:

select id from t where num=0

3 Vermeiden Sie ungleiche Werturteile

Sie sollten versuchen, die Verwendung von != oder a878737c2c5841852156509b62fd3dc9 zu vermeiden, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt.

4 Vermeiden Sie die Verwendung von or-Logik
Sie sollten versuchen, die Verwendung von or in der where-Klausel zum Verbinden von Bedingungen zu vermeiden, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt, z :

select id from t where num=10 or num=20

Sie können eine Abfrage wie folgt durchführen:

select id from t where num=10
union all
select id from t where num=20

5 Verwenden Sie „in“ und „not in“ mit Vorsicht.
„in“ und „not in“ sollten ebenfalls mit Vorsicht verwendet werden, da dies sonst zu einer vollständigen Tabelle führt Scannen, wie zum Beispiel:
Wählen Sie die ID aus t1 aus, wobei die Nummer in ist (Wählen Sie die ID aus t2 aus, wobei die ID > 10 ist)
Zu diesem Zeitpunkt scannt die äußere Abfrage die gesamte Tabelle, ohne Indizes zu verwenden. Es kann wie folgt geändert werden:
ID aus t1 auswählen, (ID aus t1 auswählen, wobei ID > 10)t2, wobei t1.id = t2.id
Zu diesem Zeitpunkt wird der Index verwendet, was die Abfrageeffizienz erheblich verbessern kann. 6. Achten Sie auf Fuzzy-Abfragen Verwenden Sie die ausgewählte ID von t mit einem Namen wie „abc%“, um eine Fuzzy-Abfrage zu implementieren. Der Index wird verwendet. Wenn der Header-Abgleich eine notwendige Logik ist, wird empfohlen, eine Volltextsuchmaschine (Elastic Search, Lucene, Solr usw.) zu verwenden.

7 Feldberechnungen in Abfragebedingungen vermeiden
Sie sollten versuchen, Ausdrucksoperationen für Felder in der where-Klausel zu vermeiden, da dies dazu führen würde, dass die Engine die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt. Zum Beispiel:
select id from t where num/2=100
sollte geändert werden in:

select id from t where num=100*2

8 Vermeiden Sie funktionale Operationen an Feldern in Abfragebedingungen

sollte Dies sollte so weit wie möglich erfolgen. Vermeiden Sie die Ausführung funktionaler Operationen an Feldern in der where-Klausel, da dies dazu führen würde, dass die Engine die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt. Zum Beispiel:
Wählen Sie eine ID aus t aus, wobei Teilzeichenfolge (Name,1,3)='abc' ist – die ID, deren Name mit abc beginnt, sollte geändert werden in:
Wählen Sie eine ID aus t aus, wobei der Name etwa „abc%“ lautet

9 Hinweise zur linken Seite von „=" in der WHERE-Klausel
Führen Sie keine Funktionen, Rechenoperationen oder andere Ausdrucksoperationen auf der linken Seite von „=" in der WHERE-Klausel aus, da sonst das System möglicherweise nicht funktioniert in der Lage, den Index richtig zu verwenden.


10 Verwendung eines zusammengesetzten Index Wenn Sie das Indexfeld als Bedingung verwenden und der Index ein zusammengesetzter Index ist, muss das erste Feld im Index als Bedingung verwendet werden, um sicherzustellen, dass das System das verwendet Andernfalls wird der Index nicht verwendet und die Feldreihenfolge sollte so weit wie möglich mit der Indexreihenfolge übereinstimmen. 11 Definieren Sie keine unbedenklichen Abfragen gibt keinen Ergebnissatz zurück, verbraucht aber Systemressourcen. Es sollte wie folgt geändert werden: Tabelle #t(...) erstellen

12 existiertOft ist die Verwendung eine gute Idee existiert statt in Wählen Sie: select num from a where num in(select num from b)
Ersetzen Sie durch die folgende Anweisung:

select num from a where exist(select 1 from b where num=a.num)

13 Indizes können ebenfalls fehlschlagen
Nicht alle Indizes sind für Abfragen wirksam. Wenn in der Indexspalte eine große Menge doppelter Daten vorhanden ist, kann dies der Fall sein Verwenden Sie ihn nicht. Wenn in einer Tabelle beispielsweise ein Feld „Geschlecht“ vorhanden ist und fast die Hälfte männlich und die Hälfte weiblich ist, hat dies keine Auswirkung auf die Abfrageeffizienz, selbst wenn ein Index auf dem Geschlecht basiert.

14 Auswahl des Tabellenfeldtyps
Versuchen Sie, numerische Felder zu verwenden, die nur numerische Informationen enthalten. Versuchen Sie, sie nicht als Zeichentypen zu entwerfen. Dies verringert die Leistung von Abfragen und Verbindungen und erhöht den Speicheraufwand . Dies liegt daran, dass die Engine bei der Verarbeitung von Abfragen und Verbindungen jedes Zeichen in der Zeichenfolge einzeln vergleicht und für numerische Typen nur ein Vergleich ausreicht.
Verwenden Sie so oft wie möglich varchar anstelle von char, da Felder mit variabler Länge erstens wenig Speicherplatz haben und Speicherplatz sparen können. Zweitens ist die Sucheffizienz in einem relativ kleinen Feld offensichtlich höher.

15 ​​​​Felder in der Abfragesyntax
Verwenden Sie „select * from t“ nirgendwo, ersetzen Sie „*“ durch eine bestimmte Feldliste und geben Sie keine nicht verwendeten Felder zurück.

16 Indexunabhängige Optimierung
Verwenden Sie kein *, versuchen Sie, keine Union, Union All und andere Schlüsselwörter zu verwenden, versuchen Sie, das Schlüsselwort oder nicht zu verwenden, versuchen Sie, eine Gleichwertigkeitsbeurteilung zu verwenden.

Es wird empfohlen, nicht mehr als 5 Tischverbindungen zu haben. Wenn es mehr als 5 sind, denken Sie über das Design des Tisches nach. (In Internetanwendungen)

Für Tabellenverbindungsmethoden sind externe Links besser als Inline-Links.
Grundlegende Daten liegen in äußeren Verbindungen vor. Beispiel: A verbindet sich links mit B, die Grunddaten sind A.
Ein innerer Join B: Wenn keine Basisdaten vorhanden sind, verwenden Sie zuerst das kartesische Produkt, um den vollständigen Join abzuschließen, und rufen Sie dann den Ergebnissatz des inneren Joins gemäß den Verbindungsbedingungen ab.

Wenn bei der Durchführung von Paging-Abfragen für große Datentabellen die Anzahl der Seitenzahlen zu groß ist, verwenden Sie Unterabfragen, um die Paging-Logik zu vervollständigen.
Wählen Sie * aus der Tabellengrenze 1000000, 10 aus.
Wählen Sie * aus der Tabelle aus, in der sich die ID befindet (wählen Sie PK aus der Tabellengrenze 100000, 10)

Das obige ist der detaillierte Inhalt vonWie führt MySQL eine SQL-Optimierung durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn