Ist es schlecht für die Leistung, alle Spalten auszuwählen?

8

Ist es schlecht für SELECT alle Spalten gleichzeitig, obwohl Sie wahrscheinlich nicht alle benötigt haben? Sie können sie jedoch in einer anderen Aufgabe benötigen, aber Sie sind zu faul, um Abfragen für jede Aufgabe zu schreiben.

Sollten Sie nur Abfragen durchführen, bei denen Sie SELECT only columns benötigen, und diese Abfrage erneut ausführen, wenn Sie eine andere Spalte benötigen?

Die Frage ist also im Grunde genommen: Hat es Auswirkungen auf die Leistung von SELECT eine Spalte gegenüber mehreren Spalten?

Die Abfrage ist sehr einfach (keine Funktionen, Joins etc.) Zum Beispiel:

%Vor%     
yoshi 02.08.2014, 08:32
quelle

2 Antworten

12

Das Problem hier ist nicht so sehr der Datenbankserver, sondern nur die Netzwerkkommunikation. Wenn Sie alle Spalten auf einmal auswählen, sagen Sie dem Server, dass er zu Ihnen zurückkehrt, alle Spalten gleichzeitig. Was Bedenken bezüglich IO betrifft, werden diese in der Frage und Antwort @ Karamba gut angesprochen gab in einem Kommentar: wählen Sie * vs Spalte auswählen . Aber für die meisten realen Anwendungen (und ich verwende "Anwendungen" in jeder Hinsicht) ist das Hauptproblem nur der Netzwerkverkehr und wie lange es dauert, die Daten zu serialisieren, zu übertragen und dann zu deserialisieren. Obwohl die Antwort eigentlich die gleiche ist.

Es ist also toll, alle Spalten zurückzuziehen, wenn Sie alle verwenden wollen, aber das kann eine Menge zusätzlicher Datenübertragung sein, besonders wenn Sie lange Strings in Ihren Spalten speichern. In vielen Fällen ist der Unterschied natürlich nicht feststellbar und meistens nur eine Frage des Prinzips. Nicht alle, aber eine deutliche Mehrheit.

Es ist wirklich nur ein Kompromiss zwischen deiner zuvor erwähnten Faulheit (und vertraue mir, wir fühlen uns alle so) und wie wichtig die Leistung wirklich ist.

Wenn Sie tun beabsichtigen, alle Spaltenwerte zu verwenden, ist es viel besser, wenn Sie alle auf einmal zurückziehen und dann eine Reihe von Abfragen durchführen.

Stellen Sie sich vor, Sie machen eine Websuche: Sie suchen, Sie finden Ihre Seite und Sie brauchen nur ein Detail. Du könntest die ganze Seite lesen und alles über das Thema wissen, oder du könntest einfach zu dem Teil springen, über den du suchst und der erledigt ist. Letzteres ist viel schneller, wenn das alles ist, was Sie jemals wollen, aber wenn Sie dann über die anderen Aspekte lernen müssen, wäre es viel besser, wenn Sie sie das erste Mal lesen, als Ihre Suche erneut durchführen zu müssen die Website, um darüber zu reden.

Wenn Sie nicht sicher sind, ob Sie die anderen Spaltenwerte in der Zukunft benötigen, dann ist das Ihre Aufforderung als Entwickler, für welchen Fall es wahrscheinlicher ist.

Es hängt alles davon ab, was Ihre Anwendung ist, was Ihre Daten sind, wie Sie sie verwenden und wie wichtig Ihnen wirklich ist.

    
Matthew Haugen 02.08.2014 09:07
quelle
8

Die Auswahl einer einzelnen Spalte kann einen großen Einfluss auf die Leistung bestimmter Abfragen haben. Zum Beispiel ist es effizienter für die Abfrage-Engine, einen Index zu verarbeiten, als Daten auf den ursprünglichen Datenseiten nachzuschlagen. Wenn ein überdeckender Index verfügbar ist (dh ein Index, der alle für eine Abfrage erforderlichen Spalten enthält), wird die Abfrage schneller ausgeführt. Bei großen Tabellen, die zu groß für den verfügbaren Speicher sind, kann die Verwendung eines Deckungsindex ein großer, großer Gewinn sein. (Denken Sie in einigen Fällen an Verbesserungen der Leistung.)

Ein weiterer Fall, in dem eine begrenzte Anzahl von Spalten nützlich ist, ist, wenn eine oder mehrere Spalten sehr groß sind, wie zum Beispiel eine BLOB- oder TEXT-Spalte. Diese können in der Größe auf Zehntausende von Bytes oder sogar Megabyte wachsen. Abrufen von ihnen und eine große Last auf dem Server.

Es besteht die Gefahr, * zu verwenden, wenn Sie vorbereitete Anweisungen haben und sich die zugrunde liegende Struktur der Tabelle ändert. Die Abfrage selbst könnte veralten (ich hatte dieses Problem in anderen Datenbanken, aber nicht speziell in MySQL). Die zugrunde liegende Änderung könnte so einfach sein wie den Namen einer Spalte ändern. Was als Kompilierzeitfehler aufgefasst wird, ist stattdessen ein Laufzeitfehler, der viel mysteriöser sein könnte.

Im Allgemeinen haben die Gründe für die Vermeidung von * mehr mit der Netzwerkleistung zu tun. In vielen Fällen wird es keinen großen Unterschied machen. Wenn Sie 20 Zeilen aus einer Tabelle zurückgeben, in der jede Zeile durchschnittlich 100 oder 200 Byte enthält, ist der Unterschied zwischen der Auswahl aller Spalten und einer Teilmenge der Spalten in den meisten Hardwareumgebungen gering. Die meiste Zeit, die für die Abfrage verbracht wird, ist das Kompilieren der Abfrage, das Ausführen in der Engine und das Lesen der Datenseiten. Der Unterschied zwischen der Rückgabe von 200 Bytes oder 2000 Bytes ist wahrscheinlich kein großer Unterschied.

Es gibt jedoch Fälle (wie die oben aufgeführten), wo es einen großen Unterschied machen kann. Also, * zu vermeiden, ist eine gute Angewohnheit, aber wenn Sie es hin und wieder benutzen, wird es wahrscheinlich Ihr System nicht zum Einsturz bringen.

    
Gordon Linoff 02.08.2014 12:12
quelle

Tags und Links