Vergleich der Effizienz zwischen Einzeltabellenabfrage und Mehrtabellen-Joinabfrage in der MySql-Datenbank

Vergleich der Effizienz zwischen Einzeltabellenabfrage und Mehrtabellen-Joinabfrage in der MySql-Datenbank

Während dieser Zeit stieß ich bei der Arbeit an einem Projekt auf ein Modul, bei dem die Verbindungen zwischen den Daten sehr komplex waren. Beim Erstellen der Tabelle war ich sehr verwirrt. Wie soll ich mit diesen komplexen Daten umgehen? Soll ich eine einzelne Tabelle abfragen und dann die Beziehung zwischen den Daten auf der Geschäftsebene behandeln oder soll ich die Datenbeziehung direkt über eine Verbindungsabfrage für mehrere Tabellen behandeln?

Nach der Konsultation von Materialien und der Lektüre von Blogs gibt es zwei Antworten:

1. Antworten in „High Performance MySQL“

Viele Hochleistungsanwendungen zerlegen zugehörige Abfragen. Sie können ganz einfach für jede Tabelle eine einzelne Tabellenabfrage durchführen und die Ergebnisse dann in Ihrer Anwendung zusammenführen. Beispielsweise die folgende Abfrage:

Wählen Sie * aus dem Tag aus
trete tag_post bei tag_post.tag_id=tag.id
Beitrag beitreten am tag_post.post_id=post.id
wobei tag.tag='mysql';

Kann stattdessen in die folgenden Abfragen unterteilt werden:

Wählen Sie * aus dem Tag, wobei tag='mysql';
Wählen Sie * aus Tag_Post, wo Tag_ID = 1234;
Wählen Sie * aus dem Beitrag, in dem die ID in (123,456,567,9989,8909) ist.

Warum um alles in der Welt tun Sie das?

Auf den ersten Blick bringt dies keinen Vorteil. Die ursprüngliche Abfrage wird hier zu mehreren Abfragen und die zurückgegebenen Ergebnisse sind genau dieselben.

Tatsächlich bietet die Rekonstruktion von Abfragen durch Zerlegung zugehöriger Abfragen die folgenden Vorteile: (Bei Anwendungen mit hoher Parallelität und hoher Leistung wird im Allgemeinen die Verwendung von Einzeltabellenabfragen empfohlen.)
1. Machen Sie den Cache effizienter. Viele Anwendungen können die Ergebnisobjekte, die Einzeltabellenabfragen entsprechen, problemlos zwischenspeichern. Darüber hinaus kann der Abfragecache für den MySQL-Abfragecache nicht verwendet werden, wenn sich eine Tabelle in der Zuordnung ändert. Wenn sich eine Tabelle nach dem Aufteilen selten ändert, kann die auf der Tabelle basierende Abfrage die Ergebnisse des Abfragecaches wiederverwenden.

2. Nach dem Aufteilen der Abfrage kann die Ausführung einer einzelnen Abfrage die Sperrkonflikte reduzieren.

3. Durch das Erstellen von Verknüpfungen auf der Anwendungsebene wird die Aufteilung der Datenbank erleichtert und eine hohe Leistung und Skalierbarkeit erreicht.

4. Die Effizienz der Abfrage selbst kann ebenfalls verbessert werden.

5. Es kann die Abfrage redundanter Datensätze reduzieren.

6. Darüber hinaus entspricht dies der Implementierung von Hash-Joins in der Anwendung, anstatt die verschachtelten Ring-Joins von MySQL zu verwenden. In einigen Szenarien sind Hash-Joins viel effizienter.

7. Die Abfrage einer einzelnen Tabelle ist bei großen Datenmengen für die spätere Aufteilung von Datenbanken und Tabellen von Vorteil. Wenn eine gemeinsame Abfrage verwendet wird, muss das ursprüngliche SQL geändert werden, sobald die Datenbank aufgeteilt ist.

8. Als ich das letzte Mal sah, wie ein CTO seine Technologie teilte, legte das Unternehmen fest, dass Join-Abfragen auf der untersten Ebene verboten seien. Bei großen Datenmengen ist es tatsächlich langsam.

9. Join-Abfragen können zwar tatsächlich schnell sein, aber MySQL-Ressourcen sind normalerweise viel knapper als Programmcode-Ressourcen.

2. Einige andere Antworten

Hypothetisches Szenario: Angenommen, die Website verfügt über einen Bereich mit einer Firmenbibliothek und ich möchte nach allen Firmen in einer bestimmten Stadt suchen.

Datentabellen: tbl_company (t1), tbl_city (t2).

Beispiel 1:

Die Tabelle t1 speichert die CityID und führt Tabellenverknüpfungsabfragen basierend auf der ID durch.

wähle * von t1 innerer Join t2 auf t1.cityid=t2.cityid;

Beispiel 2:

Die Tabelle t1 speichert den cityName. Wenn der Benutzer im Frontend auf Shanghai klickt, wird die ID von Shanghai an das Backend übergeben (ohne die Übergabe des cityName zu berücksichtigen).

Suchen Sie den Städtenamen basierend auf der ID. Wählen Sie den Städtenamen aus t2 aus, wobei cityid = #{cityid};

Wählen Sie dann * aus t1, wobei cityName = #{cityName};

Der Unterschied zwischen beiden: Beispiel 1 führt nur eine Tabellenassoziationsabfrage aus, während Beispiel 2 zwei einzelne Tabellenabfragen ausführt.

Angesichts der großen Datenmenge wirken sich Verknüpfungsabfragen mit mehreren Tabellen auf die Abfrageeffizienz aus. Daher werden sie alle auf Einzeltabellenabfragen optimiert. TP: Das Obige ist ohne Verwendung von Indizes

Welches wird effizienter sein?

Antwort: SQL-Optimierung ist auch geschäftsbezogen. Wird diese Anweisung häufig abgefragt? Sollte der durch zwei Verbindungen verursachte Overhead berücksichtigt werden? Wenn diese nicht berücksichtigt werden müssen und kein Index vorhanden ist, ist der Unterschied nicht groß. 2 sollte etwas besser sein als 1.

Wenn die Daten nicht besonders groß sind, ist die kaskadierende Abfrage immer noch schneller.

Reduzieren Sie bei herkömmlichen Datenbanken die Anzahl der Datenbankabfragen so weit wie möglich.

ABER: 1. MySQL verarbeitet Verbindungen/Verbindungsabbrüche sehr schnell und antwortet auf kleine und einfache Abfragen. 2. Die heutigen Netzwerke sind sehr schnell. Mehrere kleine Abfragen können also für MySQL schneller sein.

Schließlich hat der Meister keine Schlussfolgerung darüber, welche Methode besser ist. Haha, tatsächlich drückt das ganze Buch eine Bedeutung klar aus: Testen! Benchmarken! Testen Sie beide Methoden in Ihrer eigenen Datenumgebung. Lassen Sie die Daten für sich selbst sprechen.

Abschluss

Ich persönlich empfehle die Verwendung einer einzelnen Tabellenabfrage! Besser wäre es, die Daten bereits auf der Anwendungsebene zu verknüpfen!

Oben sind die Details zum Problem der Effizienz von MySql-Einzeltabellenabfragen und -Verbindungsabfragen mit mehreren Tabellen aufgeführt. Weitere Informationen zur Effizienz von MySql-Einzeltabellen- und -Verbindungsabfragen mit mehreren Tabellen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Fallstudie zur MySQL-Mehrtabellenabfrage
  • Detaillierte Klassifizierung von MySQL-Mehrtabellenabfragen
  • MySql-Multitabellenabfragetransaktion und DCL
  • Detaillierte Erläuterung der MySQL-Multitabellen-Joinabfrage
  • Konkretes Beispiel einer MySQL-Mehrtabellenabfrage
  • MySQL-Abfragemechanismus für mehrere Tabellen

<<:  Detaillierte Analyse der HTML-Semantik und der zugehörigen Front-End-Frameworks

>>:  Prozess des Klassenlademechanismus von Tomcat und Quellcodeanalyse

Artikel empfehlen

jQuery implementiert einen einfachen Karusselleffekt

Hallo zusammen, heute werde ich die Implementieru...

Detaillierte Schritte zum Löschen von Umgebungsvariablen in Linux

Wie lösche ich Umgebungsvariablen unter Linux? Ve...

Eine vollständige Liste gängiger Linux-Systembefehle für Anfänger

Das Erlernen von Linux-Befehlen stellt für die me...

10 beliebte Windows-Apps, die auch unter Linux verfügbar sind

Laut dem Datenanalyseunternehmen Net Market Share...

Teilen Sie das Problem, dass Ubuntu 19 die Docker-Quelle nicht installieren kann

Entsprechend den wichtigsten Websites und persönl...

Mehrere Möglichkeiten zur Implementierung der Vererbung in JavaScript

Inhaltsverzeichnis Strukturelle Vererbung (implem...

Detaillierte Erklärung zur Installation von MySQL in der Alibaba Cloud

Als leichte Open-Source-Datenbank wird MySQL häuf...

Grundlegendes zur JavaScript-Prototypenkette

Inhaltsverzeichnis 1. Verständnis der Gleichheits...