Anzahl an Datensätzen eines SQL-Results ermitteln

Dies ist ein Gastbeitrag von Stefan Riedinger.

Oft braucht man die Anzahl der vorhanden Datensätze eines Result-Sets – zum Beispiel für Statistiken, in denen man angeben möchte wie viele Datensätze es in dem Projekt gibt. Dieser Beitrag untersucht die Möglichkeiten die Anzahl der Datensätze zu ermitteln.

Grundsätzlich gibt es zwei Möglichkeiten, die hier nun vorstellt und verglichen werden sollen:

  1. Wir selektieren ein beliebiges Element der Tabelle oder eine Kontante, führen den SQL-Befehl mitsamt WHERE-Bedingung normal aus und lassen mysql_num_rows() die Anzahl der Datensätze ermitteln.
    In Code:
      $result = mysql_query("SELECT 1 FROM tabelle WHERE spalte='123'"); echo mysql_num_rows($result);                                    
  2. Wir benutzen in SQL die count-Funktion
    In Code:

      $result = mysql_query("SELECT COUNT(*) FROM tabelle WHERE spalte='123'"); echo mysql_result($result,0);                                    

Meine erste Überlegung war nun, das mysql_num_rows() schneller sein wird, da diese Funktion speziell für das Auswerten der Anzahl der Datensätze ist.
Ich habe nun einen kleinen Test gestartet, in dem ich die beiden Methoden miteinander verglichen habe.
Die Datenbank hatte im Test 678 Datensätze und der Befehl wurde 1000 mal ausgeführt um eine Durchschnittszeit zu errechnen.

1. Methode
Durchschnitt: 0.51376736474 ms

2. Methode
Durchschnitt: 0.0429143209457 ms

Das Ergebnis zeigt, das die zweite Methode rund 12mal schneller ist. Für jemanden, der etwas tiefer in der Materie steckt, sollte das Ergebnis nicht überraschend sein.

Bei der ersten Methode werden alle Elemente, die sich in der Datenbank befinden, selektiert und an PHP übergeben, die Funktion mysql_num_rows() wertet nun die Anzahl der Datensätze aus.
Dies macht die ganze Sache natürlich etwas langsamer, wie man es an dem Test gemerkt hat.

Die zweite Methode hingegen sendet von dem Datenbanksystem nur eine Zahl, nämlich die Anzahl der Datensätze. Das Zählen übernimmt hier SQL. Der Traffic zwischen PHP und MySQL ist somit viel geringer (und wächst vor allem nicht mit der Anzahl der Datensätze -> Komplexität O(1) ).

Ich frage mich nun aber nach dem Einsatzbereich von mysql_num_rows(), für das Zählen ist diese Funktion ungeeignet, da sie viel zu langsam ist.
Vielleicht weiß ja jemand von den Lesern einen guten Grund um mysql_num_rows() anzuwenden.

Anmerkung von daryl: Eine Ursache für den massiven Geschwindigkeitsunterschied könnte auch das Query Caching sein, denn MySQL cacht die Queries ja und somit bleibt auf PHP-Seite trotzdem noch der Aufwand des Zählens per mysql_num_rows().


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0