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

Implementierung eines Puzzlespiels mit js

In diesem Artikel wird der spezifische Code von j...

Die Umsetzung von Youdas neuem Petite-Vue

Inhaltsverzeichnis Vorwort Einführung Live Einfac...

Grundsätze für die Bereitstellung und Konfiguration mehrerer Tomcat-Instanzen

1. Schalten Sie die Firewall aus und übertragen S...

So lösen Sie das Problem der automatischen Paketaktualisierung im Debian-System

Ich weiß nicht, wann es angefangen hat, aber jede...

Sechs Möglichkeiten zur Steigerung der Geschwindigkeit Ihrer Website

1. Ersetzen Sie die Adresse Ihrer .js-Bibliotheks...

Probleme bei der Verwendung der Rich-Text-Bearbeitung mit Wangeditor in Vue

wangEditor ist ein webbasierter Rich-Text-Editor,...

Zusammenfassung der Web-Frontend-Kenntnisse (persönliche praktische Erfahrung)

1. Als ich heute eine Seite erstellte, stieß ich a...

Detaillierte Erklärung zur Verwendung von MySQL, wobei

Inhaltsverzeichnis 1. Einleitung 2. Haupttext 2.1...

So zeichnen Sie in CocosCreator ein cooles Radardiagramm

Inhaltsverzeichnis Vorwort Vorschau Text Grafikko...

So installieren Sie MySQL auf CentOS und richten den Fernzugriff ein

1. Laden Sie die MySQL-Repo-Quelle herunter $ wge...

Stellen Sie einen Varnish-Cache-Proxyserver basierend auf Centos7 bereit

1. Lackübersicht 1. Einführung in Varnish Varnish...