Chef: MySQL anzahl der Zeilen

Hallo,

Ich muss sehr oft abfragen, wie viele Zeilen in einer Tabelle vorhanden sind.
Im moment mache ich das so:

  
$sql="SELECT id,userid,title,content FROM pm WHERE myid='".$MyID."';";  
$result=mysql_query($sql) OR DIE (mysql_error());  
$count=mysql_num_rows($result);  
  
if ($count>0)  
while ($row=mysql_fetch_assoc($result))  
{  
  ...  
}  

Nun habe ich aber gelesen, dass das sehr langsam ist. Und man sollte das mit dem Befehl COUNT machen:

  
$sql="SELECT COUNT(id) FROM pm WHERE myid='".$MyID."';";  
$result=mysql_query($sql) OR DIE (mysql_error());  
$count=mysql_fetch_array($result);  
$count=$count[0];  
  
if ($count>0)  
{  
  $sql="SELECT id,userid,title,content FROM pm WHERE myid='".$MyID."';";  
  $result=mysql_query($sql) OR DIE (mysql_error());  
  
  while ($row=mysql_fetch_assoc($result))  
  {  
    ...  
  }  
};  

Was stimmt nun? Was ist besser?

  1. Hi,

    Ich muss sehr oft abfragen, wie viele Zeilen in einer Tabelle vorhanden sind.

    Nun habe ich aber gelesen, dass das sehr langsam ist. Und man sollte das mit dem Befehl COUNT machen:

    Fragst du die Daten immer so ab? D.h., du stellst den eigentlichen Query nur, wenn dir die vorherige Prüfung mit COUNT(id) einen positiven Wert erbracht hat?
    Dann kannst du dir das IMHO sparen, da es zwischen dem zurückgeben einer leeren Ergebnismenge (Query 1) und dem Berechnen von COUNT(*) = 0 keinen relevanten Zeitunterschied geben sollte. Wenn du tatsächlich Ergebniszeilen zurückbekommst, dann musst du diese ja sowieso aus der DB abholen, also kannst du dir die COUNT-Query sparen.

    Etwas anders wäre es, wenn du den COUNT-Query signifikant anders/schneller gestalten kannst. Dann kann es passieren, dass das vorteilhaft ist.

    Allgemein kann ich dir nur den Rat geben, das im Einzelfall auszutesten.

    Bis die Tage,
    Matti

  2. Hi!

    Ich muss sehr oft abfragen, wie viele Zeilen in einer Tabelle vorhanden sind.
    $sql="SELECT id,userid,title,content FROM pm WHERE myid='".$MyID."';";
    $result=mysql_query($sql) OR DIE (mysql_error());

    or die() ist üblicherweise keine angemessene Fehlerbehandlung. Der Anwender kann für einen DBMS-Fehler meist nichts und sollte eine Alternative geboten bekommen, und keine mit einer Fehlermeldung abgebrochene Ausgabe.

    $count=mysql_num_rows($result);

    Diese Funktion kann nicht raten. Damit sie überhaupt arbeiten kann, müsste MySQL vorab die Ergebnismenge zählen. Das macht aber soweit ich weiß keines der bekannten DBMS. MySQL auch nicht. Aber die in PHP eingebaute MySQL-Client-API greift zu einem Trick: Sie holt bei einem mysql_query() automatisch im Hintergrund alle Datensätze ab und kann sie nun auch zählen. Das Fetchen holt die Datensätze dann nur noch aus dem Puffer.

    while ($row=mysql_fetch_assoc($result))

    Wenn du die Datensätze sowieso brauchst, dann ist es kein Problem, wenn sie bereits zum Client übertragen wurden.

    Nun habe ich aber gelesen, dass das sehr langsam ist. Und man sollte das mit dem Befehl COUNT machen:

    Wenn du ausschließlich ihre Anzahl brauchst, dann ist das relevant.

    Was stimmt nun? Was ist besser?

    Ist es besser, von allen relevanten Daten aus dem Archiv eine Kopie zu holen, um diese zu zählen und anschließend wegzuwerfen? Oder sollte man nicht lieber gleich im Archiv zählen und nur eine Zahl als Ergebnis nach "oben" bringen?

    Und wie verhält sich die Sachlage in deinem zweiten Beispiel? Sollte man erstmal alles gewünschte im Archiv suchen und zählen und anschließend erneut suchen und "hochbringen" oder einmal suchen und das Ergebnis nach dem Mitbringen zählen?

    Lo!