2010-03-18 12 views
5

Mögliche Duplizieren:
Which is faster/best? SELECT * or SELECT column1, colum2, column3, etc.Mit * in SELECT-Abfrage

ich zur Zeit eine Anwendung in MySQL3 und PHP4 auf PHP5 MySQL5 und geschrieben am portieren.

Bei der Analyse habe ich mehrere SQL-Abfragen gefunden, die "select * from tablename" verwenden, auch wenn nur eine Spalte (Feld) in PHP verarbeitet wird. Die Tabelle hat fast 60 Spalten und einen Primärschlüssel. In den meisten Fällen ist die einzige verwendete Spalte id, die der Primärschlüssel ist.

Wird es einen Leistungsschub geben, wenn ich Abfragen verwende, bei denen die Spaltennamen explizit anstelle von * angegeben sind? (In dieser Anwendung gibt es nur eine Methode, die wir brauchen, um alle Spalten und alle anderen Methoden geben nur eine Teilmenge der Spalten)

Antwort

10

Es ist allgemein gute Praxis nur holen betrachtet, was gebraucht wird. Insbesondere wenn sich der Datenbankserver nicht auf demselben Computer befindet, führt das Abrufen einer ganzen Zeile zu langsameren Abfragen, da mehr Daten über das Netzwerk an den Computer mit dem erforderlichen Aufwand übertragen werden müssen. Wenn also eine vollständige Zeile 100 KB Daten entspricht und Sie nur die ID benötigen, die viel weniger ist, werden Sie natürlich schnellere Ergebnisse erhalten.

Als allgemeine Spitze Anfragen zur Optimierung, verwenden Sie die EXPLAIN statement, um zu sehen, wie teuer eine Abfrage sein wird.

+1

Ich denke, Ihre Antwort ist die beste bisher – ant

2

Wird es Performance-Schub, wenn ich Abfragen verwenden, in denen die Spalte Namen werden stattdessen ausdrücklich von * genannt? - JA

1

Ja. Wenn Sie mehr Daten abrufen, als Sie benötigen, muss dies von der Festplatte gelesen und zwischen MySQL und PHP übertragen werden, was wahrscheinlich länger dauern wird.

+0

'SELECT *' ist optimiert, aber Sie haben nur die Spalten, die Sie benötigen, richtig gelesen. –

1

Ob und wie viel Sie davon profitieren, hängt vom Fall ab, aber zumindest für die Fälle, in denen Sie nur die ID-Spalte benötigen, sollten Sie das SQL reparieren.

Zusätzlich zu dem reduzierten Netzwerkverkehr (des Sendens nutzloser Daten) kann die Datenbank in der Lage sein, zu den wenigen Spalten zu gelangen, die Sie nur mit Indizes benötigen, ohne auf die Tabelle zuzugreifen. Das würde die Dinge sehr beschleunigen.

Der einzige mögliche Nachteil ist die erhöhte Anzahl der unterschiedlichen SQL-Anweisungen, dass der Server (und komplexeren Code auf Ihrer Seite) zu verarbeiten hat.

1

Nein - es wird Auswirkungen auf die Leistung haben, aber solange es keine BLOBs/CLOBs im Schema gibt, wird es vernachlässigbar sein (außer Sie greifen auf Ihre Datenbank über ein 300-Baud-Modem zu) die Datenbank die Zeilen bei der Identifizierung der WHERE-Klausel entsprechen - aber seine (IMHO) schlechter Programmier SELECT zu verwenden *

C.

4

„Vorzeitige Optimierung ist Wurzel des ganzen Übels“. Donald Knuth.

fragen Sie nie eine Frage, wie Will there be any performance boost?. Aber stellen Sie nur eine Frage wie "Ich habe einen gewissen Engpass. Wie kann ich es beseitigen?"

In 99% unserer Anwendungen, diese‚Verbesserung‘würde irrlelvant sein. Wie viele andere Verbesserungen auf der Grundlage der Träume, nicht auf den Profilierungs und wirklichen Bedürfnisse.

+1

Sorry, aber ich kann nicht zustimmen. Vorzeitige Optimierung ist ein schlechtes Argument dafür, die gewünschten Felder nicht anzugeben. Es ist eine Entschuldigung für Faulheit, was das ist. –

1

Ja. Fetch nur . die Spalten, die Sie benötigen das kann nicht nur die Leistung verbessern, aber es wird Ihr Code versehentlich brechen verhindern Betrachten Sie diese Abfrage.

SELECT * von Taba JOIN Tabb auf ... ORDER BY COLX

Diese Abfrage funktioniert heute, wenn nur tabA colX hat, aber wenn Sie das Schema ändern und colX zu tabB hinzufügen, wird die Abfrage abgebrochen.

Natürlich hilft auch die Verwendung von Tabellenaliasen für alle Felder, einen Bruch zu verhindern.

-Krippe