Hi Leute ich programmiere gerade an einem Porjekt, wo ich auf einer Website, an die 20 SQL-Abfragen habe. Ist das zu viel ? Leidet die Performance unter realen Bedingungen sehr ? Auf wieviel Abfragen sollte man sich beschränken ?
so direkt kann man auf die Frage wohl keine Antwort geben.
Grundsätzlich solltest du natürlich immer versuchen, die Anzahl der Datenbankzugriffe so gering wie möglich zu halten.
Aber 20 Abfragen sind in der Regel für eine dynamische Seite als vollkommen normal zu betrachten. Auch performancemäßig sollte dies in der Regel auch zu absolut keinen Problemen führen.
Da brauchst du dir bei so einer Anzahl wirklich keine Gedanken darüber machen.
Wenn du allerdings jetzt einen Haufen von Abfragen über mehrere Tabellen hinweg und mit Datenmengen von mehreren hundert MB durchführst, könnte das schon eher zu Performanceproblemen führen.
20 - ist nicht gerade wenig, aber wie mh1001 schon geschrieben hat, würd ich mir eigentlich keine Gedanken darüber machen, wieviele Datenbankabfragen es sind, solange du mit etwas Verstand programmierst.
Ein kurzes (primitives) Beispiel dazu:
Du hast eine Tabelle Mitarbeiter die ein FK-Feld zur Tabelle Firma haben (Firma hat viele Mitarbeiter). Jetzt stellst du eine Liste alle Mitarbeiter dar:
PHP:
foreach($mitarbeiteras$id=>$daten){echo"Name: ".$daten['name'];echo"Firma: ".mysql_query("SELECT name FROM firma WHERE id=".$daten['firma_fk']);}
So produzierst du unnötig viele Datenbankfragen. Besser:
PHP:
$cache_firmen=array()foreach($mitarbeiteras$id=>$daten){if(!isset($cache_firmen[$daten['firma_fk']])){$cache_firmen[$daten['firma_fk']]=mysql_query("SELECT name FROM firma WHERE id=".$daten['firma_fk'])}echo"Name: ".$daten['name'];echo"Firma: ".$cache_firmen[$daten['firma_fk']];}
so wird jeder Firmen-Datensatz nur einmal geladen.
Hängt auch sehr stark vom sever ab wo die DB drauf rennt.
Falls die Datenbank auf einer 16 CPU Cluster Maschine läuft solltest du dir keine grossen gedanken machen (ich weiss nicht mal ob MySQL cluster fähig ist )
Spass beiseite, versuch einfach die SQL befehle auf das nötige zu beschrenken (also keine full table scans wenn es nicht nötig ist usw usw)
Ob 20 Abfragen viel sind bzw langsam lässt sich wirklich kaum pauschal beantworten, da die Anzahl auch wenig über die Laufzeit aussagt, auch der Datenbankaufbau selbst muß mit berücksichtigt werden. Als Faustregel kann man aber sagen das ein Query nicht länger als 100ms (das ist schon relativ viel und bei "MySQL-Datenbanken" eher untypisch) benötigen sollte um vernünftige Antwortzeiten zu erhalten.
Ich kann meinen Vorrednern nur zustimmen: 20 "normale" Abfragen sind locker zu verkraften. Selbst wenn du an so Dinge wie Engima bereits angesprochen hat nicht denkst wirst du wahrscheinlich keine Probleme haben.
Allerdings gibt es viele Faktoren von denen die Entscheidung ob es in Ordnung ist oder nicht abhängt. Zum einen natürlich wie viele Besucher auf deine Seite kommen. Logisch: 100 User pro Tag verursachen weniger traffic und Serverlast als mehrere Tausend. Zweitens natürlich auch was und wie viel du in den Datenbanken speicherst. So soll es zum Beispiel möglich sein Bilder in eine Datenbank zu speichern was natürlich schwachsinn ist. Aber ich denke es ist klar worauf ich hinaus will. Wenn du nur (überschaubare) Texte bzw. Zahlen speicherst: in der Regel kein Problem. Auch größere Texte könntest du falls die Serverlast zu hoch wird in Dateien speichern und in der Datenbank nur den Link dazu speichern.
Ich kann mich dem anschliessen, dass man das nicht pauschal beantworten kann.
- Es hängt von den Queries ab: Ich habe die Erfahrung gemacht, dass einige kurze Queries schneller abarbeitbar sein können als ein Monsterquery mit einigen Joins.
- Es hängt vom Datenbankdesign ab: Je ausnormalisierter die DB ist, desto mehr Joins wird man benötigen.
- Vernünftige Indices verschnellern die Sache enorm.
- Bei den Queries (wo sinnvoll) mit Limits arbeiten. Das bringt ebenfalls Geschwindigkeit.
- Nur numerische Primärschlüssel verwenden. Ebenfalls wegen der Geschwindigkeit.
- Wenn möglich auf LEFT OUTER JOINS verzichten.
- Bei komplizierten Queries kann eine dynamische Generierung sinnvoll sein. So lässt sich evt. das ein oder andere JOIN sparen.
So produzierst du unnötig viele Datenbankfragen. Besser:
PHP:
$cache_firmen=array()foreach($mitarbeiteras$id=>$daten){if(!isset($cache_firmen[$daten['firma_fk']])){$cache_firmen[$daten['firma_fk']]=mysql_query("SELECT name FROM firma WHERE id=".$daten['firma_fk'])}echo"Name: ".$daten['name'];echo"Firma: ".$cache_firmen[$daten['firma_fk']];}
so wird jeder Firmen-Datensatz nur einmal geladen.