Schlamperei mit „SELECT *“

Das Selektieren von Datensätzen gehört in MySQL zur Tagesordnung. Und trotzdem kann dabei performance-technisch viel falsch gemacht werden (Stichwort richtiger Einsatz von Indizes). Doch bevor man Indizes setzt, sollte man sich auf die absoluten Grundlagen konzentrieren (obwohl Indizes wohl auch dazu gehören 🙂 )
Oft sieht man (besonders bei etwas unerfahreneren Entwicklern) die Datenbank-Abfrage

SELECT * FROM TABLE WHERE spalte='wert'

Es geht insbesondere um das SELECT *. Diese Abfrage selektiert alle Spalten, in denen spalte=’wert‘. Oft werden allerdings nicht alle Spalten für die weitere Verarbeitung benötigt. Das ist das eine Problem vom Sternchen: unnötiger Speicherverbrauch und damit auch längere Laufzeit aufgrund von unnötig selektierten Spalten.
Wenn man nur von einer Tabelle selektiert ist das Problem schon schlimm, noch schlimmer wirds aber bei Joins, denn jede Extra-Spalte muss mitgejoint werden – ein enormer Zusatzaufwand.
Und selbst wenn sie (unwahrscheinlicherweise) alle Spalten benötigen, ist die Sternchen-Variante nicht zu empfehlen. Erstens können später im Zuge einer Erweiterung weitere Spalten zu der Tabelle hinzugefügt werden, die für die Verarbeitung der einen Stelle dann nicht mehr benötigt werden (womit wieder unnötig Speicher vergeudet wäre). Das zweite Problem ergibt sich aus dem folgendem Absatz.

Das zweite Problem beim Sternchen ist, dass MySQL erstmal nachsehen muss, welche Spalten denn überhaupt in der Tabelle enthalten sind. Das kostet (zwar nicht viel) ebenfalls Zeit.

Am Beispiel:

SELECT * 
FROM `tabelle` 
LIMIT 10000;
 
--Ergebnis in 0,1396 s
 
SELECT ID,titel,email 
FROM `tabelle` 
LIMIT 10000;
 
--Ergebnis in 0,0370 s

Die Sternchen Variante benötigt also ca 3,7 mal so lange wie das Selektieren der gewünschten Spalten. Der Faktor ist natürlich abhängig, wieviele unnötige Spalten man beim Selektieren eingespart werden können. Trotzdem zeigt dieses Beispiel eindrucksvoll, warum „SELECT *“ nicht verwendet werden sollte.

Merke: Immer nur die Spalten selektieren, die für die Verarbeitung auch benötigt werden !!!

Habe gerade noch ein schönes Bild zum Thema bei Techtalk gefunden:
SELECT * bringt nur Probleme

Jan hat 152 Beiträge geschrieben

Eine Antwort schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert mit *

You may use these HTML tags and attributes: <a href=""> <blockquote cite=""> <pre lang=""> <b> <strong> <i> <em>