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
Collapse
X
-
Natürlich braucht die Zeit.
SELECT * FROM ...
WHILE (datensätze vorhanden) {
Zaehlmal ++;
}
Ist ein Enormer Unterschied mit gecachter Seite oder der COUNT-funktion
Leave a comment:
-
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
Leave a comment:
-
Da mich das ja jetzt doch alles interessiert. Erzähl mal, wie du deine Zeilen jetzt zählst.
Leave a comment:
-
Allerdings das Zählen verlangt Prozessorleistung wenn Du Tabellen mit vielen Spalten hast, so schauts mal bei mir zumindest aus.
Leave a comment:
-
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
Leave a comment:
-
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?
Leave a comment:
-
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.Last edited by onemorenerd; 13-06-2005, 18:46.
Leave a comment:
-
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?
Leave a comment:
-
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);
Leave a comment:
-
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
Leave a comment:
-
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 10Last edited by Cybermarco; 13-06-2005, 17:34.
Leave a comment:
-
Code:SHOW columns FROM table
kannst du mal bitte dein anliegen näher erläutern?
Leave a comment:
-
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 VorausTags: None
Leave a comment: