& (MySQL) Serverbelastung durch DB-Abfrage
Alex
- php
0 Rouven0 Alex
0 Sven Rautenberg
Hallo,
kann eine solche Datenbankabfrage (ohne "LIMIT") zu einer Überlastung des Servers führen, wenn die Datenbank sehr viele Einträge hat?
$result = mysql_query("SELECT id FROM ".$table);
$count = mysql_num_rows($result);
Danke & Grüsse: Alex
Hallo,
grundsätzlich führt natürlich ein LIMIT zu einer etwas geringeren Belastung des Datenbankservers. Falls dein Beispiel ernst gemeint ist, dann ist das sicherlich nicht die effizienteste Art das zu machen - mit
SELECT COUNT(*) FROM ...
wäre die Abfrage in einem Schritt gemacht, ohne dass die Datenbank alle Datensätze in ihrem Speicher zur Verfügung stellt um sie abrufbar zu machen. So gesehen solltest du dann etwas daran ändern. Grundsätzlich solltest du bei jeder Abfrage versuchen so wenig abzufragen wie möglich, d.h. Spalten einschränken und Datensätze filtern - Das schont den Speicher des Servers etwas...
Rouven
Hallo,
Falls dein Beispiel ernst gemeint ist, dann ist das sicherlich nicht die effizienteste Art das zu machen - mit
SELECT COUNT(*) FROM ...
wäre die Abfrage in einem Schritt gemacht, ...
Also so?
$result = mysql_query("SELECT COUNT(*) FROM ".$table);
Ist $result dann die Anzahl der Einträge?
Danke & Grüsse: Alex
Hallo,
Also so?
$result = mysql_query("SELECT COUNT(*) FROM ".$table);
Ist $result dann die Anzahl der Einträge?
Nein. Es fehlt noch:
list ($anzahl) = mysql_fetch_row ($result);
$anzahl ist dann die Anzahl der Einträge.
Gruß Henk
Hallo,
Nein. Es fehlt noch:
list ($anzahl) = mysql_fetch_row ($result);
$anzahl ist dann die Anzahl der Einträge.
O.K. - Danke für Eure Antworten!
Ginge das eigentlich auch so (und wenn ja, was wäre besser)?
$anzahl = mysql_fetch_array($result);
Grüsse: Alex
Hallo Alex,
Ginge das eigentlich auch so (und wenn ja, was wäre besser)?
$anzahl = mysql_fetch_array($result);
Nein. Überleg' bitte, was mysql_fetch_array() wohl zurückliefert.
?
Gemerkt?
Wie greifst Du auf so etwas zu, wenn Du z.B. die genaue Anzahl kennst?
Gruss,
Vinzenz
Hallo Alex,
$result = mysql_query("SELECT COUNT(*) FROM ".$table);
Ist $result dann die Anzahl der Einträge?
nee, $result bleibt ein Zeiger auf eine Query-Ressource.
Da musst Du die Lösung erst rausholen mit $antwort=mysql_fetch_assoc($result)
Und dann schaust Du einfach mal mit
<pre>
<? print_r($antwort); ?>
</pre>
nach, was da so drinsteht. Die Antwort kenne ich aber: --- 42 ---
Liebe Grüße aus http://www.braunschweig.de
Tom
Moin!
kann eine solche Datenbankabfrage (ohne "LIMIT") zu einer Überlastung des Servers führen, wenn die Datenbank sehr viele Einträge hat?
$result = mysql_query("SELECT id FROM ".$table);
$count = mysql_num_rows($result);
Was getan werden muß, muß getan werden. Um gewisse Dinge kommst du einfach nicht herum. Und in der Regel funktionieren sie ja auch prima. Wenn du tatsächlich auf eine Überlastung gestoßen bist, ist es interessant, die Art der Überlastung genauer zu untersuchen, um dann gezielt Abhilfe zu schaffen. So ins Blaue hinein einen Rat zu geben dürfte schwierig sein.
An deiner Abfrage kann ich grundsätzlich erst einmal nichts verwerfliches finden. MySQL kommt selbst prima mit mehreren Milliarden Datensätzen zurecht - und wenn der Server ausreichend dimensioniert ist, sogar in einer sehr guten Abfragezeit. Bedenke, dass irgendwo das Ergebnis deiner Abfrage von der Datenbank zwischengespeichert werden muß - gerne wird das im RAM getan, und wenn RAM alle ist, kommt Auslagerungsspeicher auf der Festplatte zum Einsatz - natürlich erstmal nicht bei deinen Abfragedaten, sondern bei Programmen, die gerade nicht benutzt werden - was durchaus zu Konflikten führen kann, wenn die eben doch benutzt werden. Irgendwann geht die Performance in den Keller, und der Server reagiert nicht mehr.
Außerdem speichert PHP die Abfragedaten zwischen. Du kannst im Abfrageergebnis schließlich frei herumspringen und nicht nur der Reihe nach die Datensätze auslesen, sondern wahlfrei. Zu diesem Zeitpunkt hat MySQL den Speicherplatz hoffentlich wieder freigegeben, aber rechne lieber damit, dass beide Systeme zumindest zeitweise jeweils den kompletten Speicherplatz benötigen. Wenn du also eine Abfrage machst, die 500 Megabyte an Daten bewegt, dann hast du besser 1 Gigabyte an RAM alleine für diese Aufgabe übrig - plus dem, was der Server sonst noch so braucht.
Zum Glück tritt solch ein Fall nicht ganz so häufig auf. In der Regel kann man eine riesige Abfrage immer irgendwie einschränken auf Teilmengen, die nacheinander bearbeitet werden.
- Sven Rautenberg
Zum Glück tritt solch ein Fall nicht ganz so häufig auf. In der Regel kann man eine riesige Abfrage immer irgendwie einschränken auf Teilmengen, die nacheinander bearbeitet werden.
Ja - die einzige Abfrage, die ich halt nicht aufteilen kann, ist, alle Einträge zu zählen.
Ansonsten Danke für Deine genaueren Ausführungen - das war mir bisher noch nicht so ganz klar.
Grüsse, Alex
Hallo Alex,
Ja - die einzige Abfrage, die ich halt nicht aufteilen kann, ist, alle Einträge zu zählen.
Und genau für diesen Zweck gibt es die Funktion COUNT(),
falls Du Englisch kannst, schau mal in die MySQL-Doku:
http://www.mysql.com/doc/en/Counting_rows.html
BTW, COUNT() gehört zum ANSI-SQL-Standard und Du brauchst Dir sicher keine Gedanken zu machen, irgendein RDBMS (relationales Datenbankmanagementsystem) würde COUNT() nicht unterstützen.
Schau Dir die Beispiele dort an, dann solltest Du verstehen warum diese Abfrage RAM-schonend ist, und wie Du darauf zugreifen kannst.
Gruss,
Vinzenz