2014-03-13 10 views
6

Wird die Zeit, die eine Website-Seite geladen wird, einen erkennbaren Unterschied ausmachen? Im Durchschnitt haben meine Tabellen 10 Spalten. Wenn ich nur 3 dieser Spalten benötige, sollte ich diese in der Abfrage einfach aufrufen, um sie schneller zu machen?Benötigt SELECT * wirklich mehr Zeit als nur die benötigten Spalten auszuwählen?

+1

Was haben Sie von Ihren Benchmarks gesehen? – JoelFan

+0

Der Zeitunterschied ist wahrscheinlich klein und wird wahrscheinlich von anderen Faktoren überlagert, so dass er vom Benutzer wahrscheinlich nicht bemerkt wird (aber es könnte sich bei mehreren Benutzern addieren und kritisch werden). Eine wichtige Ausnahme könnte sein, wenn Sie eine große Spalte mit nicht benötigten Daten zurückgeben (z. B. Bilder, die in einem Feld gespeichert sind). Debugging, Wartung und Zuverlässigkeit sind jedoch wahrscheinlich bessere Gründe, die Verwendung von SELECT * zu vermeiden. – Kickstart

+0

0,723 Sekunden vs 0,0717 Sekunden für eine Tabelle, wo ich drei Spalten mit 131.563 Datenzeilen summiert. Ist das überhaupt kein Unterschied? –

Antwort

2

Ja, wenn Sie nur eine Handvoll Spalten benötigen, wählen Sie nur diese aus. Im Folgenden sind einige Gründe:

  1. die naheliegendste: zusätzliche Daten benötigt für größere Pakete zurückgeschickt werden, machen zu übertragen (über lokale Buchse oder Rohr). Dies erhöht die Gesamtlatenz. Dies scheint nicht viel für 1 oder 2 Zeilen zu sein, aber warten Sie, bis Sie 100 oder 1000 Zeilen haben ... 7 zusätzliche Spalten von Daten werden signifikant die gesamte Transit Latenz beeinflussen, besonders wenn Sie am Ende die Ergebnismenge gebrochen haben müssen in mehr TCP-Pakete für die Übertragung. Dies ist möglicherweise nicht so ein Problem, wenn Sie einen Localhost-Socket treffen, aber Ihre DB auf einen Server über ein Netzwerk, in ein anderes Datencenter, etc. verschieben ... und die Auswirkung wird klar als Tag sein!
  2. Wenn der MySQL-Query-Cache aktiviert ist, erhöht das Speichern nicht benötigter Daten in Ergebnismengen Ihren Bedarf an Speicherplatz im Cache - größere Abfragecaches können Leistungseinbußen erleiden.
  3. Ein riesiger Treffer kann sein: Wenn Sie nur Spalten benötigen, die Teil eines Deckungsindex sind, dann werden für die restlichen Datenfelder in der Haupttabelle Nachschlagpunktsuchen benötigt, statt nur die Daten aus dem Indextabelle.
1

Ja, Sie sollten.

Die Verwendung von benannten Spalten in SELECT ist eine bewährte Methode, die aus mehreren Gründen mit der Datenbank arbeitet.

Nur die benötigten Daten werden von der Datenbank zum Anwendungsserver übertragen, wodurch die CPU-, Speicher- und Festplattennutzung reduziert wird.

Es hilft bei der Erkennung von Codierungsfehlern und Strukturänderungen.

Es gibt nur wenige Fälle, in denen die Verwendung von select * eine gute Idee ist, bei allen anderen Abfragen einen Gefallen tun und die Spaltennamen verwenden.

2

Angenommen, Sie haben eine Tabelle mit 1000 Spalten hatte, und man brauchte nur 3.

Was denken Sie schneller laufen würde und warum?

Dies: SELECT * FROM table_name;

oder dies: SELECT col1, col2, col3, FROM table_name;

Wenn Sie * verwenden Sie nun, dass die gesamte Auswahl halten (groß oder klein) im Speicher. Je größer die Auswahl ist, desto mehr Speicher wird benötigt/benötigt.

Auch wenn Ihre Tabelle nicht unbedingt groß ist, würde ich nur die Daten auswählen, die Sie tatsächlich benötigen. Sie werden vielleicht nicht einmal einen Unterschied in der Geschwindigkeit bemerken, aber es wird definitiv schneller sein.

6

Wird es einen unterscheidbaren Unterschied machen. Wahrscheinlich nicht unter den meisten Umständen. Hier sind einige Fälle, wo es möglicherweise einen großen Unterschied machen würde:

  • Die 7 nicht benötigten Spalten sind wirklich, wirklich groß.
  • Sie geben viele und viele Zeilen zurück.
  • Sie haben einen großen Tisch, viele Reihen bekommen, und ein Index für die drei Spalten vorhanden ist, aber nicht der 10.

Aber es gibt andere Gründe nicht * zu verwenden:

  • Es ersetzt die Spalten basierend auf der Reihenfolge der Spalten in der Datenbank zum Zeitpunkt der Kompilierung der Abfrage. Dies kann zu Problemen führen, wenn sich die Struktur der Tabelle ändert.
  • Wenn sich ein Spaltenname ändert oder entfernt wird, funktioniert Ihre Abfrage und der nachfolgende Code kann beschädigt werden. Wenn Sie die Spalten explizit auflisten, wird die Abfrage unterbrochen, wodurch das Problem leichter zu erkennen ist.
  • Die Eingabe von drei Spaltennamen sollte keine große Sache sein. Durch das explizite Auflisten der Spalten wird der Code informativer.
+1

Guter Punkt auf der Bestellung und der Überraschung Code zu brechen. Dies ist auch ein Problem, wenn Sie auf Daten in einem nicht assoziativen Array wie '$ row [0]' zugreifen, in dem PHP-Code möglicherweise nicht bricht, aber Sie möglicherweise unerwartete Ergebnisse erhalten. Stellen Sie sich vor, dass die Tabelle {name, credit_card_number, email} abgefragt wird, um die E-Mail-Adresse des Benutzers anzuzeigen, und jemand eine Spalte nach 'name' hinzufügt, jetzt zeigt 'echo $ row [2]' die Kreditkartennummer an – Ray

0

Kurz gesagt ist ja, wenn Sie mehr Daten zurückgeben wird es länger dauern. Dies kann eine sehr, sehr, sehr kleine Menge an Zeit sein, aber ja, es wird länger dauern. Wie oben erwähnt, kann * in einer Produktionssituation gefährlich sein, in der Sie möglicherweise nicht derjenige sind, der die Datenbank entwirft/implementiert. Wenn Sie davon ausgehen, dass Spalten in einer bestimmten Reihenfolge zurückgegeben werden oder die Datenbankstruktur von einem bestimmten Typ ist und der DBA dann eingeht und Änderungen vornimmt und Sie nicht informiert, liegt möglicherweise ein Problem mit Ihrem Code vor.

0

Der Unterschied ist sehr minimal, aber es gibt einen kleinen Unterschied, ich denke, es hängt wirklich von mehreren Faktoren ab, die schneller sind.

1) Wie viele Spalten befinden sich in der Tabelle?

2) Wie viele Spalten brauchen Sie eigentlich zu greifen?

3) Wie viele Datensätze greifen Sie?

In Ihrem Fall, basierend auf dem, was Sie gesagt haben mit 10 Spalten und nur 3 dieser Spalten, bezweifle ich, es wird einen Unterschied machen, wenn Sie 'Select *' oder nicht verwenden, außer vielleicht greifen Sie Zehntausende von Aufzeichnungen. Aber in extremeren Fällen mit viel mehr Spalten habe ich gefunden 'Select *', etwas schneller zu sein, aber das ist möglicherweise nicht in allen Fällen wahr.

Ich habe einmal einige Geschwindigkeitstests in einer SQLite-Tabelle mit über 150 Spalten durchgeführt, wobei ich nur etwa 40 der Spalten erfassen musste, und ich benötigte alle über 20.000 Datensätze. Die Geschwindigkeitsunterschiede waren sehr minimal (wir sprechen von 20 bis 40 Millisekunden Unterschied), aber es war tatsächlich schneller, die Daten aus allen Spalten mit einem 'SELECT ALL *' zu erfassen, anstatt 'Select All Field1, Field2, etc' zu gehen.

Ich nehme an, je mehr Datensätze und Spalten in Ihrer Tabelle, desto größer ist die Geschwindigkeitsdifferenz dieses Beispiel wird Sie. Aber wenn Sie nur 3 Spalten in einer riesigen Tabelle benötigen, würde ich denken, dass das Ergreifen dieser 3 Spalten schneller wäre.

Fazit, wenn Sie wirklich die minimalen Geschwindigkeitsunterschiede zwischen 'Select *' und 'Select field1, field2, etc' interessieren, dann machen Sie einige Geschwindigkeitstests.

0

Ja definitiv. * wird mit allen Spaltennamen ersetzt. Danach beginnt nur die Ausführung. Zum Beispiel, wenn 3 Spalten a, b, c in einer Tabelle vorhanden sind.Wählen Sie a, b, c startet direkt die Ausführung wo, wie wählen Sie * fängt an, die Abfrage zu transformieren, wählen Sie a, b, c danach nur die Ausführungsstatistik.

Verwandte Themen