Warum erfordern Codestandards, dass SQL-Anweisungen nicht zu viele Verknüpfungen enthalten?

Warum erfordern Codestandards, dass SQL-Anweisungen nicht zu viele Verknüpfungen enthalten?

Kostenlose Punkte

Interviewer : Haben Sie schon einmal Linux verwendet?

Ich schon

Interviewer : Ich möchte die Speichernutzung überprüfen. Welchen Befehl soll ich verwenden?

Ich : free oder top

Interviewer : Dann sagen Sie mir, welche Informationen Sie mit dem kostenlosen Befehl sehen können

Ich : Wie in der Abbildung unten gezeigt, können Sie die Speicher- und Cachenutzung sehen.

  • Gesamtspeicher
  • verwendeter Speicher verwendet
  • freier freier Speicher
  • Buff/Cache verwendeter Cache
  • verfügbarer verfügbarer Speicher

img

Interviewer : Wissen Sie, wie man den verwendeten Cache (Buff/Cache) bereinigt?

Ich : ähm... ich weiß nicht

Interviewer : sync; echo 3 > /proc/sys/vm/drop_caches kann buff/cache bereinigen. Glauben Sie, es ist gut für mich, diesen Befehl online auszuführen?

img

Ich : (Kostenlose Punkte, sehr zufrieden) Es gibt tolle Vorteile. Durch das Leeren des Caches haben wir mehr verfügbaren Speicherplatz, genau wie bei der kleinen Rakete von xx guard auf dem PC. Klicken Sie darauf und es wird viel Speicher freigegeben.

Interviewer : Ähm..., gehen Sie zurück und warten Sie auf die Benachrichtigung

SQL-Join

Interviewer : Lassen Sie uns das Thema wechseln und über Ihr Verständnis von Join sprechen.

Ich : OK (Wenn ich noch einmal falsch antworte, ist alles vorbei, also werde ich die Gelegenheit nutzen)

Rezension

join in SQL kann die angegebenen Tabellen nach bestimmten Bedingungen kombinieren und die Daten an den Client zurückgeben

Die join -Methoden sind

inner join Join

img

left join beitreten

img

right join

img

full join

img

Interviewer : Wenn Sie bei der Projektentwicklung join -Anweisungen verwenden müssen, wie können Sie die Leistung optimieren und verbessern?

Ich : Es gibt zwei Situationen, einen kleinen Datenumfang und einen großen Datenumfang.

Interviewer : Und dann?

Ich : Für

  • Die Datenmenge ist gering, also legen Sie einfach alles im Speicher ab.
  • Große Datenmenge

Sie können die Ausführungsgeschwindigkeit von join -Anweisungen optimieren, indem Sie Indizes hinzufügen. Sie können die Anzahl der join reduzieren, indem Sie redundante Informationen verwenden. Versuchen Sie, die Anzahl der Tabellen-Joins zu reduzieren. Die Anzahl der Tabellen-Joins in einer SQL-Anweisung sollte 5 nicht überschreiten.

Interviewer : Wir können also davon ausgehen, dass join -Anweisungen relativ leistungsintensiv sind, oder?

Ich schon

Interviewer : Warum?

Puffer

Ich : Bei der Ausführung einer Join-Anweisung muss ein Vergleichsprozess stattfinden.

Interviewer : Ja

Ich : Zwei Tabellen einzeln zu vergleichen ist langsam, daher können wir die Daten aus den beiden Tabellen einzeln in einen內存塊lesen. Am Beispiel der InnoDB-Engine von MySQL können wir den relevanten Speicherbereich definitiv mit der folgenden Anweisung finden: show variables like '%buffer%'

img

Wie in der folgenden Abbildung gezeigt, wirkt sich die Größe von join_buffer_size auf die Ausführungsleistung unserer join -Anweisung aus

Interviewer : Abgesehen davon?

Eine wichtige Prämisse

Ich : Jedes Projekt wird irgendwann online gehen und dabei ist die Generierung von Daten unvermeidlich, wobei der Datenumfang nicht zu klein sein kann.

Interviewer : Das stimmt.

Ich : Die meisten Daten in der Datenbank werden letztendlich auf硬盤gespeichert und in Form von Dateien aufbewahrt.

Nehmen Sie als Beispiel die InnoDB-Engine von MySQL

  • InnoDB verwendetals grundlegende IO-Einheit und die Größe jeder Seite beträgt 16 KB
  • InnoDB erstellt für jede Tabelle eine .ibd Datei zur Datenspeicherung

img

verifizieren

img

Ich : Das bedeutet, dass wir so viele Dateien lesen müssen, wie wir mit den Tabellen verbinden müssen. Obwohl wir Indizes verwenden können, müssen wir den Festplattenkopf dennoch häufig bewegen.

Interviewer : Häufige Kopfbewegungen beeinträchtigen also die Leistung, oder?

Ich : Ja, behaupten die aktuellen Open-Source-Frameworks wie hbase und kafka nicht gerne, dass sie durch sequentielles Lesen und Schreiben eine stark verbesserte Leistung hätten?

Interviewer : Das stimmt. Glauben Sie, dass Linux das optimiert hat? Tipp: Sie können free erneut ausführen, um es zu überprüfen.

Ich : Warum nimmt der Cache mehr als 1,2 GB ein?

img

img

Interviewer : Haben Sie schon einmal darüber nachgedacht,

  • Was wird im buff/cache gespeichert?
  • Warum belegt buff/cache so viel Speicher, obwohl der availlable Speicher immer noch 1.1G beträgt?
  • Warum kann man den von buff/cache verwendeten Speicher mit zwei Befehlen bereinigen, used aber nur freigeben, indem man den Prozess beendet?

Probieren Sie, probieren Sie sorgfältig

Nach ein paar Minuten Nachdenken

img

Ich : Wenn Sie den von buff/cache verwendeten Speicher einfach so beiläufig freigeben, bedeutet das, dass er nicht wichtig ist und das Löschen den Betrieb des Systems nicht beeinträchtigt.

Interviewer : Das stimmt nicht ganz.

Ich : Könnte das sein? Ich erinnere mich an einen Satz in „CSAPP“ (In-depth Understanding of Computer Systems)

Das Wesentliche der Speicherhierarchie besteht darin, dass jede Speicherebene ein Cache für die Geräte in den unteren Ebenen ist.

img

In die menschliche Sprache übersetzt bedeutet dies, dass Linux den Speicher als Festplattencache behandelt

Interviewer : Jetzt wissen Sie, wie Sie diese einfache Frage beantworten, oder?

Ich : Ich…

img

Join-Algorithmus

Interviewer : Lassen Sie mich Ihnen noch eine Chance geben. Wenn ich Sie bitten würde, den Join-Algorithmus zu implementieren, was würden Sie tun?

Ich : Wenn kein Index vorhanden ist, funktionieren verschachtelte Schleifen. Wenn ein Index vorhanden ist, können Sie ihn zur Leistungsverbesserung verwenden.

Interviewer : Lassen Sie uns über join_buffer Was ist Ihrer Meinung nach im join_buffer gespeichert?

Ich : Während des Scanvorgangs wählt die Datenbank eine Tabelle aus und legt die Daten, die sie zurückgeben und mit anderen Tabellen vergleichen möchte, in join_buffer

Interviewer : Wie gehen Sie damit um, wenn ein Index vorhanden ist?

Ich : Das ist relativ einfach. Lesen Sie einfach die Indexbäume der beiden Tabellen und vergleichen Sie sie. Ich werde die Methode zum Umgang mit fehlendem Index vorstellen.

Verschachtelte Schleifenverbindung

img

Verschachtelte Schleifen lesen jedes Mal nur eine Datenzeile in der Tabelle. Das heißt, wenn outerTable 100.000 Datenzeilen und innerTable 100 Datenzeilen hat, muss es 10000000 Mal gelesen werden (vorausgesetzt, die Dateien dieser beiden Tabellen werden vom Betriebssystem nicht im Speicher zwischengespeichert; wir nennen sie kalte Datentabellen).

Natürlich verwendet derzeit keine Datenbank-Engine diesen Algorithmus (zu langsam)

Blockieren einer verschachtelten Schleife

img

Block , d. h. jedes Mal, wenn ein Datenelement in den Speicher übernommen wird, um den I/O-Overhead zu reduzieren

MySQL InnoDB verwendet diesen Algorithmus, wenn kein Index verfügbar ist.

Betrachten Sie die folgenden beiden Tabellen t_a und t_b

img

Wenn der Join-Vorgang nicht mithilfe des Index durchgeführt werden kann, verwendet InnoDB automatisch den Block nested loop -Algorithmus.

img

Zusammenfassen

Als ich noch zur Schule ging, hat mich der Datenbanklehrer gerne zu Datenbankparadigmen abgefragt. Erst als ich zu arbeiten begann, habe ich gelernt, dass die Leistung die Grundlage für alles sein sollte. Wenn Redundanz möglich ist, dann verwenden Sie sie. Wenn sie wirklich nicht möglich ist, dann join wenn join die Leistung wirklich beeinträchtigt. Versuchen Sie, Ihre join_buffer_size zu erhöhen oder die SSD zu ändern.

Damit ist der Artikel darüber, warum Codestandards erfordern, dass SQL-Anweisungen nicht zu viele Verknüpfungen enthalten, abgeschlossen. Weitere Informationen dazu, warum SQL-Anweisungen nicht zu viele Verknüpfungen enthalten sollten, 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:
  • Eine kurze Erläuterung des zugrunde liegenden Prinzips von MySQL Join
  • Analyse von Anwendungsszenarien von JOIN in SQL-Anweisungen
  • MySQL-Datenbankgrundlagen - Prinzip der Join-Operation
  • So lösen Sie das Problem des ungültigen linken Joins in MySQL und die Vorsichtsmaßnahmen bei seiner Verwendung
  • Der Prozess der schnellen Konvertierung eines MySQL-Left-Joins in einen Inner-Join
  • MySQL effiziente Abfrage Left Join und Gruppieren nach (plus Index)
  • MySQL-Joinpufferprinzip
  • Detaillierte Erklärung verschiedener Join-Zusammenfassungen von SQL

<<:  CSS-Code zur Unterscheidung von IE8/IE9/IE10/IE11 Chrome Firefox

>>:  Der Unterschied zwischen dem Namen und der ID des Ziels eines Tags, das auf das Iframe verweist

Artikel empfehlen

Fortgeschrittene JavaScript-Programmierung: Variablen und Umfang

Inhaltsverzeichnis 1. Ursprungswert und Bezugswer...

HTML-Code, der den Internet Explorer zum Einfrieren bringen kann

Wir müssen lediglich einen beliebigen Texteditor ö...

HTML-Tabellen-Tag-Tutorial (35): spaltenübergreifendes Attribut COLSPAN

In einer komplexen Tabellenstruktur erstrecken si...

Zusammenfassung einiger Vorschläge zum HTML-Code-Schreibstil

Das Protokoll der Ressourcendatei weglassen Es wi...

Lösung zur automatischen Beendigung von Docker Run-Containern

Heute ist bei mir ein Problem aufgetreten, als ic...

Lösungen für MySQL OOM (Speicherüberlauf)

OOM steht für „Out Of Memory“, was so viel bedeut...

So verwenden Sie die asynchrone Anforderungs-API von Axios in Vue

Inhaltsverzeichnis Einrichten einer einfachen HTT...

MySQL-Passwort ist korrekt, aber keine lokale Anmeldung möglich -1045

MySQL-Passwort ist korrekt, aber keine lokale Anm...

Entwurf und Implementierung einer kaskadierenden Dropdown-Box in Vue

Inhaltsverzeichnis 1. Datenbankdesign 2. Frontend...

Analyse des Remote-Debuggings und des Timeout-Betriebsprinzips von Webdiensten

Remote-Debugging von Webdiensten In .NET ist die ...