• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Eine MySQL Abfrage, zwei Varianten: Gibt es nennenswerte Geschwindigkeitsvorteile?

Kirschtomate

New member
Hey!

Ich schreibe gerade an einem etwas umfangreicheren HTML (bzw. PHP) Suchformular. In meiner Datenbank werden viele Produkteigenschaften abgebildet, wodurch in meiner SELECT Abfrage etwa 20 Tabellen "gejoint" werden müssen. Nun gibt es wohl zwei Möglichkeiten, wie meine SELECT Abfrage aussehen kann:

a.)

$abfrage = "select tabelle_1.*, tabelle_2.*
from
tabelle_1
join tabelle_2
on tabelle_1.id = tabelle_2.id
where (tabelle_1.wert = '$wert_1' or '' = '$wert_1') -- Das Feld wert_1 muss nicht ausgefüllt werden
and (tabelle_2.wert = '$wert_2' or '' = '$wert_2') -- Das Feld wert_2 muss nicht ausgefüllt werden
group by tablle_1.id";

b.)

if ($wert_2 !== '') {
$wert_2 = ' and tabelle_2.wert = ' . $wert_2 . ' '; // Das Feld wert_2 wurde ausgefüllt
}


$abfrage = "select tabelle_1.*, tabelle_2.*
from
tabelle_1
join tabelle_2
on tabelle_1.id = tabelle_2.id
where (tabelle_1.wert = '$wert_1' or '' = '$wert_1')"
. $wert_2 .
"group by tablle_1.id";

Sind durch Variante B nennenswerte Geschwindigkeitsvorteile zu erwarten? In der Datenbank sollen sich mittelfristig 1000 bis 2000 Datensätze befinden. Die maximale Anzahl der Datensätze liegt geschätzt bei etwa 5000.

Schöne Grüße, KT
 
Zuletzt bearbeitet:
Ich schreibe gerade an einem etwas umfangreicheren HTML (bzw. PHP) Suchformular. In meiner Datenbank werden viele Produkteigenschaften abgebildet, wodurch in meiner SELECT Abfrage etwa 20 Tabellen "gejoint" werden müssen. Nun gibt es wohl zwei Möglichkeiten, wie meine SELECT Abfrage aussehen kann:
Also ich sehe einige ernste Probleme:
- ein JOIN über 20 Tabellen geht extrem auf die Performance
- man sollte ein SELECT * unterlassen und stattdessen die exakten Feldnamen verwenden
- Dein GROUP BY funktioniert so nicht
- zu hoffen steht auch, dass Du einer SQL-Injection vorbeugst

Deine Frage geht jetzt also dahin, ob Du Deine WHERE Klausel immer vollbesetzt oder dynamisch zusammenbauen sollst. Mit den oben genannten Problemen solltest Du eher Dein Datenmodell in Frage stellen.
Ansonsten sind 20 String-Vergleiche und ein gezieltes SQL-Statement besser, als mehrere Millionen Vergleiche, die noch dazu unnötig ausgeführt werden.
 
Also ich sehe einige ernste Probleme:
- ein JOIN über 20 Tabellen geht extrem auf die Performance

Ich sehe leider keine andere Möglichkeit. Wenn ich z.B. Videorecorder, DVD Player und Blueray Player abbilde, habe ich allein dadurch schon zwei extra Tabellen:

Typ ID | Typ Name
1, Blueray
2, DVD
3, Video

Produkt ID | Typ ID
1, 1
1, 2
2, 3
3, 1
3, 2
....

Die Anzahl der Tabellen erhöht sich sehr schnell, wenn man einige 1:n bzw. m:n Beziehungen abbildet.

- man sollte ein SELECT * unterlassen und stattdessen die exakten Feldnamen verwenden
- Dein GROUP BY funktioniert so nicht

Da hast du natürlich Recht, ist ein schnell bzw. schlecht gewähltes Beispiel. Verzeihung!

- zu hoffen steht auch, dass Du einer SQL-Injection vorbeugst

Der MySQL Benutzer, über welchem die Verbindung hergestellt wird, hat nur Select Rechte. Außerdem verwende ich mysql_real_escape_string().

Deine Frage geht jetzt also dahin, ob Du Deine WHERE Klausel immer vollbesetzt oder dynamisch zusammenbauen sollst. Mit den oben genannten Problemen solltest Du eher Dein Datenmodell in Frage stellen.
Ansonsten sind 20 String-Vergleiche und ein gezieltes SQL-Statement besser, als mehrere Millionen Vergleiche, die noch dazu unnötig ausgeführt werden.

Das klingt soweit logisch, danke für deinen Beitrag!
 
Zuletzt bearbeitet:
Zurück
Oben