Ich behaupte, dass ein ordentliches DBMS, dem man ein
SELECT COUNT(*) AS n FROM tabelle
hinwirft, keinesfalls erstmal ein
SELECT * FROM tabelle WHERE
ausführt und dann übers Resultset galoppiert mit
WHILE (datensätze vorhanden) n++;
Ein ordentliches DBMS kennt stets die aktuelle Anzahl Datensätze jeder Relation, halbordentliche berechnen sie (z.B. über Kardinalität eines Index, also u.U. eine Dateigröße durch Länge eines Indexdatensatzes minus Blockverwaltungstabellengröße etc.).
Ganz anders sieht es aus, wenn man sagt
SELECT COUNT(*) FROM tabelle WHERE <condition>
denn wenn bezüglich <condition> nicht gerade eine ausführliche Statistik vorgehalten wird, muß jedes DBMS erstmal durch die Daten gehen. Dabei wird ein ordentliches aber auch wieder kein Resultset von
SELECT * FROM tabelle WHERE <condition>
erzeugen, sondern jeden Datensatz auf <condition> prüfen, den Zähler ggf. erhöhen und den Datensatz dann sofort wieder verwerfen/verdrängen.
Somit kann ein COUNT() mit <condition> durchaus schneller sein, weil das DBMS eine einfache Verdränungsstrategie fahren kann, Blöcke wahlfrei lesen kann und auf keinerlei Sortierung achten muß.
Wenn es mit MySQL unter keinen Umständen schneller geht, dann ist MySQL wohl "unordentlich". (In mancherleis Hinsicht wie zum Beispiel Locking weiß man das sogar mit Sicherheit.)
Was den Transfer eines Resultsets angeht: Wird da nicht nur ein Objekt übergeben, das neben einigem semantischem Zucker vor allem einen Speicherzeiger enthält? Das braucht nur unmeßbar wenig Zeit.
COUNT(*) problem - mysql
Einklappen
X
-
Natürlich braucht die Zeit.
SELECT * FROM ...
WHILE (datensätze vorhanden) {
Zaehlmal ++;
}
Ist ein Enormer Unterschied mit gecachter Seite oder der COUNT-funktion
Einen Kommentar schreiben:
-
Natürlich braucht die Zeit.
Angenommen Du hast 100.000 Datensätze und fängst an durchzuzählen.
Was das COUNT macht ist nichts weiteres als
SELECT * FROM ...
WHILE (datensätze vorhanden) {
Zaehlmal ++;
}
Ist ein Enormer Unterschied mit gecachter Seite oder der COUNT-funktion
Einen Kommentar schreiben:
-
Da mich das ja jetzt doch alles interessiert. Erzähl mal, wie du deine Zeilen jetzt zählst.
Einen Kommentar schreiben:
-
Allerdings das Zählen verlangt Prozessorleistung wenn Du Tabellen mit vielen Spalten hast, so schauts mal bei mir zumindest aus.
Einen Kommentar schreiben:
-
Das Raussuchen der Spalte geht zackig.
Allerdings das Zählen verlangt Prozessorleistung wenn Du Tabellen mit viele n
Spalten hast, so schauts mal bei mir zumindest aus.
@onemorenerd
Danke mal für die Lösung.
Das hat insofern weitergeholfen, dass ich jetzt weiss dass die
Performance damit nicht verbessert wird.
Ich musste jetzt das ganze komplett anders realisieren.
Die Werte werden jetzt in ner extra Tabelle zwischengespeichert
und ständig upgedated.
Jetzt läuft die Seite wesentlich schnell, der Server ist jedoch immer
noch überlastet
Einen Kommentar schreiben:
-
Die Beschränkung auf weniger als alle Spalten dauert aber meistens länger als eine uneingeschränkte Query
Oder braucht der SQL-Server länger fürs Raussuchen der Spalte?
Einen Kommentar schreiben:
-
Sorry, das COUNT() sollte da nicht stehen. Mein Fehler.
Bzw. wenn es da steht, dann nicht mysql_num_rows() sondern wirklich ein (das einzige) Tupel lesen.
Ich denke mal Speicher ist genügend vorhanden oder?
Die Beschränkung auf weniger als alle Spalten dauert aber meistens länger als eine uneingeschränkte Query.Zuletzt geändert von onemorenerd; 13.06.2005, 17:46.
Einen Kommentar schreiben:
-
Wenn ich:
PHP-Code:$res = mysql_query("SELECT COUNT(*) FROM tabelle WHERE spalte='hund'");
$anzahl = mysql_num_rows($res);
Wenn ich :
$res = mysql_query("SELECT * FROM tabelle WHERE spalte='hund'");
$anzahl = mysql_num_rows($res);
bekomm ich den korrekten Wert zurück.
2. Lösung belegt aber Speicherresourcen. das ganze könnte ich
beschränken wenn ich nur ne variable auslese:
$res = mysql_query("SELECT spalte FROM tabelle WHERE spalte='hund'");
$anzahl = mysql_num_rows($res);
Was meint ihr?
Einen Kommentar schreiben:
-
Du verwechselst anscheinend Spalten mit Zeilen.
Jede Zeile (Tupel, Eintrag) in einer Tabelle (Relation) mit x Spalten (Attributen) hat genau x Spalten. Vielleicht sind manche NULL, dann ist kein Wert für das Attribut gesetzt, aber es existiert.
Die Anzahl der Spalten ermittelst du mitPHP-Code:$res = mysql_query("SHOW COLUMNS FROM tabelle");
$anzahl = mysql_num_rows($res);
// oder
$res = mysql_query("SELECT * FROM tabelle");
$anzahl = mysql_num_fields($res);
PHP-Code:$res = mysql_query("SELECT COUNT(*) FROM tabelle WHERE spalte='hund'");
$anzahl = mysql_num_rows($res);
Einen Kommentar schreiben:
-
Ich hab im Netz praktisch die Tutorials durchforstet wie bsp:
http://www.little-idiot.de/mysql/mysql-169.html
hab aber nicht gefunden wie ich an die Variable mit php rankomm.
Die Möglichkeit die ich im Moment benutze ist nicht optimal
Einen Kommentar schreiben:
-
ich möchte praktisch die Anzahl der Spalten haben die bestimte Kriterien erfüllen wie beispielsweise:
PHP-Code:SELECT COUNT(*) FROM datebank WHERE tiere = 'Hund'
Ich lese ständig in irgendwelchen tutoriasl
select count(*) from testerone;
bsp: Das liefert dann als Ergebnis 10Zuletzt geändert von Cybermarco; 13.06.2005, 16:34.
Einen Kommentar schreiben:
-
Code:SHOW columns FROM table
kannst du mal bitte dein anliegen näher erläutern?
Einen Kommentar schreiben:
-
COUNT(*) problem - mysql
Hallo resource.
ich hab foldendes problem. Und zwar benutze ich bisher diesen
Code um spalten zu zählen:
[COLOR=red]$query = "SELECT COUNT(*) FROM datenbank";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen");
$line = mysql_fetch_array($result, MYSQL_ASSOC);
foreach ($line as $col_value) {
$anzahl = $col_value;
}[/COLOR]
Das Problem ist dass das ganze den SErver langsam macht
da ich bei vielen spalten alle Spalten durchlaufe.
Gibts dazu keine andere Lösung um an die Anzahl meiner
Spalten in einer Datenbank zu kommen?
Danke im VorausStichworte: -
Einen Kommentar schreiben: