Heim > Datenbank > MySQL-Tutorial > Hauptteil

10 wenig bekannte SQL-Anweisungsoptimierungen

angryTom
Freigeben: 2019-11-27 13:50:43
nach vorne
2475 Leute haben es durchsucht

10 wenig bekannte SQL-Anweisungsoptimierungen

1. Einige gängige SQL-Praktiken

(1) Negative bedingte Abfragen können keine Indizes verwenden

select * from order where status!=0 and stauts!=1
Nach dem Login kopieren

nicht vorhanden/nicht vorhanden ist keine gute Angewohnheit

Empfehlen Sie „MySQL-Video-Tutorial

kann in der Abfrage optimiert werden:

select * from order where status in(2,3)
Nach dem Login kopieren

(2) Die führende Fuzzy-Abfrage kann den Index

select * from order where desc like '%XX'
Nach dem Login kopieren

nicht anstelle der führenden Fuzzy-Abfrage verwenden:

select * from order where desc like 'XX%'
Nach dem Login kopieren

( 3) Es ist nicht angemessen, Indizes für Felder mit geringer Datendifferenzierung zu verwenden

select * from user where sex=1
Nach dem Login kopieren

Grund: Es gibt nur männliche und weibliche Geschlechter und es werden jedes Mal nur sehr wenige Daten herausgefiltert, daher ist die Verwendung von Indizes nicht angemessen.

Als Faustregel können Indizes verwendet werden, wenn 80 % der Daten gefiltert werden können. Wenn für den Auftragsstatus nur wenige Statuswerte vorhanden sind, ist die Verwendung eines Index nicht sinnvoll. Wenn viele Statuswerte vorhanden sind und eine große Datenmenge gefiltert werden kann, sollte ein Index erstellt werden.

(4) Die Berechnung anhand von Attributen kann den Index nicht treffen

select * from order where YEAR(date) < = &#39;2017&#39;
Nach dem Login kopieren

Selbst wenn ein Index für das Datum erstellt wird, wird die vollständige Tabelle gescannt, die für die Wertberechnung optimiert werden kann:

select * from order where date < = CURDATE()
Nach dem Login kopieren
Nach dem Login kopieren

Oder:

select * from order where date < = &#39;2017-01-01&#39;
Nach dem Login kopieren

2. Nicht so bekannte SQL-Praktiken

(5) Wenn der größte Teil des Geschäfts eine einzelne Abfrage ist, ist die Die Leistung bei der Verwendung des Hash-Index ist besser, z. B. User Center

select * from user where uid=?
select * from user where login_name=?
Nach dem Login kopieren

Grund:

Die zeitliche Komplexität des B-Tree-Index beträgt O(log(n))

The Die Zeitkomplexität des Hash-Index beträgt O(1)

(6) Spalten, die null sein dürfen, haben potenzielle Fallstricke bei Abfragen

Einzelspaltige Indizes speichern keine Nullwerte, zusammengesetzte Indizes hingegen schon Wenn eine Spalte nicht alle Nullwerte speichern darf, erhalten Sie möglicherweise eine „Unerwartete“ Ergebnismenge

select * from user where name != &#39;shenjian&#39;
Nach dem Login kopieren

Wenn der Name null sein darf, speichert der Index keine Nullwerte und diese Datensätze wird nicht in die Ergebnismenge aufgenommen.

Verwenden Sie daher bitte keine Null-Einschränkungen und Standardwerte.

(7) Das Präfix ganz links im zusammengesetzten Index ist nicht der Wert. Die Reihenfolge der SQL-Anweisung muss mit dem zusammengesetzten Index übereinstimmen.

Das Benutzerzentrum hat einen zusammengesetzten Index erstellt (login_name, passwd)

select * from user where login_name=? and passwd=?
select * from user where passwd=? and login_name=?
Nach dem Login kopieren

kann auf den Index zugreifen, der das Präfix ganz links im zusammengesetzten Index erfüllt.

select * from user where login_name=?
Nach dem Login kopieren
Nach dem Login kopieren

kann nicht auf den Index zugreifen Index und erfüllt nicht das ganz linke Präfix des zusammengesetzten Index

( 8) Verwenden Sie ENUM anstelle einer Zeichenfolge

ENUM speichert TINYINT. Fügen Sie keine Zeichenfolgen wie „China“, „Beijing“ ein. und „Technologieabteilung“ in der Aufzählung. Der Zeichenfolgenraum ist groß und die Effizienz ist gering.

3. Nischenhafte, aber nützliche SQL-Praktiken

(9) Wenn klar ist, dass nur ein Ergebnis zurückgegeben wird, kann Limit 1 die Effizienz verbessern

select * from user where passwd=?
Nach dem Login kopieren

Kann optimiert werden auf:

select * from user where login_name=?
Nach dem Login kopieren
Nach dem Login kopieren

Grund:

Sie wissen, dass es nur ein Ergebnis gibt, aber die Datenbank weiß es nicht deutlich und lässt die Cursorbewegung aktiv stoppen

(10) Das Platzieren von Berechnungen in der Business-Schicht anstelle der Datenbankschicht spart nicht nur Daten-CPU, sondern hat auch unerwartete Auswirkungen auf die Optimierung des Abfragecaches

select * from user where login_name=? limit 1
Nach dem Login kopieren

Dies ist keine gute SQL-Praxis und sollte es auch sein optimiert werden als:

select * from order where date < = CURDATE()
Nach dem Login kopieren
Nach dem Login kopieren

Grund:

gibt die CPU der Datenbank frei

wird mehrfach aufgerufen und das eingehende SQL ist das gleiche, so dass der Abfragecache sein kann verwendet

(11) Eine erzwungene Typkonvertierung führt dazu, dass die gesamte Tabelle durchsucht wird.

$curDate = date(&#39;Y-m-d&#39;);
$res = mysql_query(
    &#39;select * from order where date < = $curDate&#39;);
Nach dem Login kopieren

Glaubst du, dass sie in den Telefonindex gelangt? Das ist ein großer Fehler. Wie kann ich diese Aussage ändern?

Abschließend noch eine Sache: Verwenden Sie nicht select *, sondern geben Sie nur die erforderlichen Spalten zurück, was den Umfang der Datenübertragung und die Speichernutzung der Datenbank erheblich reduzieren kann.

Dieser Artikel stammt von der chinesischen PHP-Website, Spalte

MySQL-Tutorial

, willkommen zum Lernen!

Das obige ist der detaillierte Inhalt von10 wenig bekannte SQL-Anweisungsoptimierungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!