count(*) oder mysql_num_rows

count(*) oder mysql_num_rows

am 25.01.2005 15:39:36 von Raphael Mansmann

Hi,
ich möchte eine Abfrage haben, die mir die Anzahl der Einträge
in einer Tabelle unter bestimmten Bedingungen zurückgibt.

Meine Frage ist jetzt, welche von 2 Methoden die bessere
(schnellere) ist.
--------
A:
$query = mysql_query("SELECT id FROM news WHERE
poster='ABC'");
$anzahl = mysql_num_rows($query);
--------

oder

--------
B:
$query = mysql_query("SELECT count(*) as anzahl FROM news
WHERE poster='ABC' LIMIT 0,1");
$row = mysql_fetch_array($query);
$anzahl = row['anzahl'];
--------

Gruß Raphael

Re: count(*) oder mysql_num_rows

am 25.01.2005 16:34:41 von Niels Braczek

Raphael Mansmann schrieb:

> Meine Frage ist jetzt, welche von 2 Methoden die bessere
> (schnellere) ist.
> A: [...]
> B: [...]

C:
$sqlStr = "SELECT count(*) as anzahl FROM news WHERE poster='ABC'"
$result = mysql_query($sqlStr) or die($sqlStr.'
'.mysql_error());
$row = mysql_fetch_assoc($result);
$anzahl = row['anzahl'];


BTW: Achte auf die Wahl der Variablennamen. Eine Query ist kein Result.

MfG
Niels

--
"Klar weiß ich, dass ich den Lack mit einem Tuch polieren kann, wie alle
Anderen das machen, ich möchte aber den Hammer benutzen. Wie geht das?"

Re: count(*) oder mysql_num_rows

am 25.01.2005 16:35:22 von Sevo Stille

Raphael Mansmann wrote:

> Meine Frage ist jetzt, welche von 2 Methoden die bessere (schnellere) i=
st.

Je nach der Optimierungslogik könnte das intern auf dasselbe herauslauf=
en.

Ohne fortgeschrittene Optimierungen oder mit einem einfachen Frontend=20
wird aber count() wohl immer schneller sein, denn da wird im Backend=20
gezählt. Bei num_rows wird das Backend mindestens neben der Zählung=20
einen Index der Resultate aufbauen, und es ist sogar möglich, daß das=
=20
Frontend die Resultate selbst zählen muß oder zumindest übertragen =

kriegt, so daß da auch noch I/O-Overhead und ggf. sogar noch eigene=20
Verarbeitung dazukommen.

Gruß Sevo

Re: count(*) oder mysql_num_rows

am 25.01.2005 17:11:19 von do.not.REMOVETHAT

Sevo Stille schrieb:

[count() oder mysql_num_rows()]

>> Meine Frage ist jetzt, welche von 2 Methoden die bessere (schnellere)
>> ist.
>
>
> Je nach der Optimierungslogik könnte das intern auf dasselbe herauslaufen.

Nein.

> wird aber count() wohl immer schneller sein

Eben.

count():
Wieviel MP3s hast Du auf der Festplatte?

mysql_num_rows():
Schick' mir mal alle Deine MP3s per Mail rüber, ich will mal zählen
wieviel Du hast.

Grüße, Matthias

Re: count(*) oder mysql_num_rows

am 25.01.2005 21:23:50 von Sevo Stille

Matthias P. Wuerfl wrote:

>> Je nach der Optimierungslogik könnte das intern auf dasselbe=20
>> herauslaufen.
>=20
> Nein.

Jein. Es ist nicht unüblich, daß die Software den Query nur vorbereit=
et,=20
und konkrete Operationen erst ausführt, wenn Daten angefordert werden. =

In dem Fall ist es zumindest möglich, bei Requests auf den gobalen Wert=
=20
der Zeilenzahl dieselben Prozeduren wie bei count() auszuführen.

> count():
> Wieviel MP3s hast Du auf der Festplatte?

Ja.

> mysql_num_rows():
> Schick' mir mal alle Deine MP3s per Mail rüber, ich will mal zählen=
=20
> wieviel Du hast.

Nein. "Ich glaube ich will vielleicht bald ein paar oder alle deine=20
MP3s" und eine Frage später "schick mir mal die Zahl". Präventiv alle=
=20
Resultate sofort ans Frontend zu transferieren macht (hoffentlich) keine =

ernstzunehmende Datenbanksoftware. Normales Vorgehen wäre, einen Index =

der Resultate anzulegen und darin den Cursor auf Element Null zu setzen, =

die globalen Parameter zu füllen, und auf konkrete Requests nach Daten =

zu warten.

Gruß Sevo

Re: count(*) oder mysql_num_rows

am 25.01.2005 21:39:27 von do.not.REMOVETHAT

Sevo Stille schrieb:

> Präventiv alle
> Resultate sofort ans Frontend zu transferieren macht (hoffentlich) keine
> ernstzunehmende Datenbanksoftware.

Wie verstehst Du den Unterschied zwischen mysql_query() und
mysql_unbuffered_query() denn sonst?

Grüße, Matthias

Re: count(*) oder mysql_num_rows

am 25.01.2005 22:32:18 von Michael Fesser

.oO(Sevo Stille)

>Matthias P. Wuerfl wrote:
>
>> mysql_num_rows():
>> Schick' mir mal alle Deine MP3s per Mail rüber, ich will mal zählen
>> wieviel Du hast.
>
>Nein. "Ich glaube ich will vielleicht bald ein paar oder alle deine
>MP3s" und eine Frage später "schick mir mal die Zahl".

Das ist die Sicht von PHP aus, aber irgendwo muß das Resultat der
Abfrage ja gespeichert werden.

Micha

Re: count(*) oder mysql_num_rows

am 26.01.2005 02:37:56 von Sevo Stille

Matthias P. Wuerfl wrote:

> Wie verstehst Du den Unterschied zwischen mysql_query() und=20
> mysql_unbuffered_query() denn sonst?

Hoffentlich nicht so - denn selbst letzteres muß im Frontend gepuffert =

werden.

Ersteres sollte daher hoffentlich mindestens im Backend gepuffert=20
werden, wenn nicht gar (wie beschrieben) in einen Index transformiert=20
werden. Aber die Wege von Mysql sind unergründlich und nicht immer=20
dieselben wie die von richtigen Datenbanken(tm)...

Gruß Sevo

Re: count(*) oder mysql_num_rows

am 26.01.2005 10:09:34 von do.not.REMOVETHAT

Sevo Stille schrieb:

>> Wie verstehst Du den Unterschied zwischen mysql_query() und
>> mysql_unbuffered_query() denn sonst?
>
>
> Hoffentlich nicht so

Hä?

Sorry, ich beginne den Faden zu verlieren. Meine Übersetzung
Deutsch-Code/Code-Deutsch war richtig. Sie ist logisch, entspricht dem
gesunden Menschenverstand, den Beobachtungen und ist auch im Manual
genau so beschrieben.

> Ersteres sollte daher hoffentlich mindestens im Backend gepuffert
> werden

Wenn da steht "Ich will alle MP3s", dann will ich alle *haben* und nicht
später noch um jedes einzelne betteln müssen.

Grüße, Matthias

Re: count(*) oder mysql_num_rows

am 26.01.2005 12:04:28 von Axel Schwenke

Sevo Stille wrote:
> Matthias P. Wuerfl wrote:
>
>> Wie verstehst Du den Unterschied zwischen mysql_query() und=20
>> mysql_unbuffered_query() denn sonst?
>
> Hoffentlich nicht so - denn selbst letzteres muß im Frontend gepuffert
> werden.
>
> Ersteres sollte daher hoffentlich mindestens im Backend gepuffert
> werden, wenn nicht gar (wie beschrieben) in einen Index transformiert
> werden. Aber die Wege von Mysql sind unergründlich und nicht immer
> dieselben wie die von richtigen Datenbanken(tm)...

Du faselst.

Der Zweck von "SELECT * ..." und "SELECT COUNT(*) ..." ist vollkommen
verschieden und es ist total blödsinnig, das erste zu schreiben, wenn
man eigentlich das zweite meint. Sogar dann wenn am anderen Ende eine
Datenbank mit hellseherischen Fähigkeiten sitzt, die diese Situation
erkennt und "SELECT *" ohne Abfrage der Ergebnisse genauso schnell und
ressourcenschonend hinbekommt wie "SELECT COUNT(*)". Ich bezweifle
übrigens ernsthaft, daß eine solche Datenbank existiert.


XL