Heim >Datenbank >SQL >Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Java学习指南
Java学习指南nach vorne
2023-07-26 16:51:041185Durchsuche

Unterfrage senden

Interviewer: Haben Sie jemals Linux bedient?

Ich: Ja

Interviewer:Welchen Befehl soll ich verwenden, um die Speichernutzung zu überprüfen

Ich:kostenlos oder oben

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

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

  • Gesamtsumme Speicher

  • gebrauchter verwendeter Speicher

  • freier freier Speicher

  • buff/cache verwendeter Cache

  • verfügbarer verfügbarer Speicher

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Interviewer: Wissen Sie dann, wie man den verwendeten Cache (Buff/Cache) löscht

?

Ich: em... Ich weiß nicht

Interviewer: sync; echo 3 > /proc/sys/vm/drop_caches Können Sie mir dann sagen, ob ich diesen Befehl online ausführen kann?

(Unterthema senden, ich freue mich sehr) Die Vorteile sind großartig. Nach dem Leeren des Caches haben wir mehr verfügbaren Speicherplatz. Genau wie bei der kleinen Rakete von xx Guardian wird viel Speicher freigegeben Ein Klick

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Interviewer:

em…., gehen Sie zurück und warten Sie auf Benachrichtigung

Lassen Sie uns noch einmal über SQL Join sprechen

Interviewer:

Wechseln Sie das Thema und sprechen Sie über Ihr Verständnis von Join

Ich:

Okay (wenn Sie es noch einmal falsch beantworten, ist es vorbei) Ergreifen Sie die Gelegenheit.)

innerer Beitritt, innerer Beitritt

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Linker Beitritt, Linker Beitritt

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Rechter Beitritt, Rechter Beitritt

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

vollständige Teilnahme

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?


Bildquelle: https://www.cnblogs.com/reaptomorrow-flydream/p/8145610.html

Interviewer: Wenn Sie während der Projektentwicklung Join-Anweisungen verwenden müssen, wie können Sie die Leistung optimieren und verbessern?

Ich:

Es gibt zwei Situationen, eine mit kleiner Datengröße und eine mit großer Datengröße.

Interviewer:

Dann?

Ich:

Für 1. Wenn die Datengröße klein ist, legen Sie einfach alles in den Speicher und das war's

2. Wenn die Datengröße groß ist

  • , Sie können den Index erhöhen. Optimieren Sie die Ausführungsgeschwindigkeit von Join-Anweisungen.

  • Sie können die Anzahl der Joins durch redundante Informationen reduzieren.

  • Versuchen Sie, die Anzahl der Tabellenverbindungen zu reduzieren für eine SQL-Anweisung sollte das 5-fache nicht überschritten werden

Interviewer:

Zusammenfassend lässt sich sagen, dass die Join-Anweisung relativ leistungsintensiv ist, oder?

Ich:

Ja

Interviewer:

Warum?

Puffer

Ich: Beim Ausführen der Join-Anweisung muss ein Vergleichsprozess stattfinden

Interviewer: Ja

Ich:Es ist relativ langsam, zwei Tabellen einzeln zu vergleichen, also können wir Lesen Sie die Daten in den beiden Tabellen nacheinander in einen Speicherblock. Am Beispiel der InnoDB-Engine von MySQL können wir den relevanten Speicherbereich mithilfe der folgenden Anweisung definitiv findenshow variables like '%buffer%'

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

join_buffer_size Die Größe wird beeinflusst Die Ausführungsleistung unserer Join-Anweisung. Interviewer:

Was sonst? klein

Interviewer:

Das ist es

Ich:

Die meisten Daten in der Datenbank werden irgendwann auf der Festplatte gespeichert und in Form von Dateien gespeichert.

Nehmen Sie als Beispiel die InnoDB-Engine von MySQL

  • InnoDB verwendet eine Seite als grundlegende E/A-Einheit und die Größe jeder Seite beträgt 16 KB.

  • InnoDB erstellt einen Speicher für jede Tabellendaten-.ibd-Datei

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Überprüfung

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Ich:Das bedeutet, dass wir so viele Dateien lesen müssen, wie es Tabellen zum Verbinden gibt, häufige Bewegungen sind jedoch immer noch unvermeidlich die Festplatte

Interviewer:Das heißt, häufige Bewegungen des Magnetkopfes wirken sich auf die Leistung aus, oder?

Ich:Ja, sagen aktuelle Open-Source-Frameworks nicht gerne, dass sie die Leistung erheblich verbessern durch sequentielles Lesen und Schreiben? , wie hbase, kafka

Interviewer: Stimmt, glauben Sie, dass Linux dies optimiert hat? Tipp, Sie können den kostenlosen Befehl erneut ausführen, um einen Blick darauf zu werfen

Ich: Seltsam wie Der Cache ist mit mehr als 1,2 GB belegt

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Bildquelle: https://www.linuxatemyram.com/

Interviewer: Haben Sie jemals darüber nachgedacht

  • buff/ im Cache gespeichert Was Ist?

  • Warum belegt Buff/Cache so viel Speicher und der verfügbare Speicher ist verfügbar und es sind immer noch 1,1 GB vorhanden?

  • Warum kann man den von Buff/Cache belegten Speicher mit zwei Befehlen bereinigen, den belegten Speicher aber nur durch Beenden des Vorgangs freigeben?

  • Ich:
Den von Buff/Cache belegten Speicher so beiläufig freizugeben bedeutet, dass er nicht wichtig ist und das Löschen keinen Einfluss auf den Betrieb des Systems hat

Interviewer:

Nicht ganz richtig

Ich: Könnte es sein? Ich denke an einen Satz in „CSAPP“ (Deep Understanding of Computer Systems)

Das Wesen der Speicherhierarchie besteht darin, dass jede Schicht des Speichergeräts der Cache des Geräts der unteren Schicht ist

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Für Laien Begrifflich, Das heißt, Linux behandelt den Speicher als Cache der Festplatte

Zugehörige Informationen: http://tldp.org/LDP/sag/html/buffer-cache.html

Interviewer: Jetzt weiß ich: Wie soll ich die Punktefrage beantworten?

Ich: Ich...

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Join-Algorithmus

Interviewer: Gib dir noch eine Chance, was würdest du tun, wenn du gefragt würdest? den Join-Algorithmus implementieren?

Ich: Wenn kein Index vorhanden ist, wird die verschachtelte Schleife beendet. Wenn ein Index vorhanden ist, können Sie den Index verwenden, um die Leistung zu verbessern.

Interviewer: Zurück zu join_buffer, was ist Ihrer Meinung nach in join_buffer gespeichert?

Ich: Während des Scanvorgangs wählt die Datenbank eine Tabelle aus und fügt die Daten ein, die sie zurückgeben und mit anderen Tabellen vergleichen muss .join_buffer

Interviewer: Wie gehe ich 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. Lassen Sie mich die indexfreie Verarbeitungsmethode vorstellen Lesen Sie jeweils eine Datenzeile in der Tabelle. Das heißt, wenn die äußere Tabelle 100.000 Datenzeilen und die innere Tabelle 100 Datenzeilen enthält, muss sie 10.000.000 Mal gelesen werden (vorausgesetzt, die Dateien dieser beiden Tabellen). wurden nicht ausgeführt) Das System speichert es im Speicher, wir nennen es eine kalte Datentabelle)

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

Verschachtelte Schleife blockieren

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Blockieren Block, das heißt, es heißt, dass jedes Mal ein Datenelement in den Speicher abgerufen wird, um den E/A-Overhead zu reduzieren

MySQL InnoDB verwendet diesen Algorithmus, wenn kein Index verwendet werden kann.

Berücksichtigen Sie die folgenden beiden Tabellen t_a und t_b

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?

Zusammenfassung

Warum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?Als ich in der Schule war, machte der Datenbanklehrer am liebsten den Datenbankparadigmentest. Erst bei der Arbeit lernte ich, dass alles auf Leistung basieren sollte, wenn es überflüssig sein kann , verwenden Sie es. Wenn es nicht redundant sein kann, schließen Sie es an, wenn es sich wirklich auf die Leistung auswirkt. Versuchen Sie, die Größe Ihres „join_buffer_size“ zu erhöhen, oder wechseln Sie zu einem Solid-State-Laufwerk.

Referenzen

„Vertiefendes Verständnis von Computersystemen“ – Kapitel 6 Speicherhierarchie

„Experimente und Spaß mit dem Linux-Festplatten-Cache“ Der Autor veranschaulicht anhand mehrerer Beispiele den Einfluss des Festplatten-Caches auf die Programmausführungsleistung "Linux hat meinen RAM gefressen》Erklärung der freien ParameterSo leeren Sie den Puffer/Pagecache (Festplatten-Cache) unter Linux.Erklärung des Unterfragebefehls am Anfang des Artikels

Wie MySQL ausgeführt wird: MySQL von der Wurzel aus verstehen
Block bested-Loop von MariaDB Das offizielle Dokument erklärt die Implementierung des Block-Nested-Loop-Algorithmus


Das obige ist der detaillierte Inhalt vonWarum erfordern Codespezifikationen, dass SQL-Anweisungen nicht zu viele Joins haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Java学习指南. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:SQL-Fall bei VerwendungNächster Artikel:SQL-Fall bei Verwendung