COUNT(*) problem - mysql

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • onemorenerd
    antwortet
    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.
    Zuletzt geändert von onemorenerd; 14.06.2005, 09:42.

    Einen Kommentar schreiben:


  • TobiaZ
    antwortet
    Natürlich braucht die Zeit.
    Dass du immer so unverfängliche Formulierungen benutzt. So gut wie alles auf der Welt braucht Zeit...

    SELECT * FROM ...
    WHILE (datensätze vorhanden) {
    Zaehlmal ++;
    }
    Ob das so ist oder nicht, vermag ich gerade nicht zu sagen. Aber selbst wenn es so ist, dann durfte wohl klar sein, dass durch den wegfallenden Transfer der Zeilen einiges an Zeit gespart wird.

    Ist ein Enormer Unterschied mit gecachter Seite oder der COUNT-funktion
    gecached ist wohl meistens schneller. aber was ist aktueller und vorallem schneller bei der manipulation.

    Einen Kommentar schreiben:


  • Cybermarco
    antwortet
    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:


  • TobiaZ
    antwortet
    Da mich das ja jetzt doch alles interessiert. Erzähl mal, wie du deine Zeilen jetzt zählst.

    Einen Kommentar schreiben:


  • TobiaZ
    antwortet
    Allerdings das Zählen verlangt Prozessorleistung wenn Du Tabellen mit vielen Spalten hast, so schauts mal bei mir zumindest aus.
    Dass Prozessorleistung benötigt wird, ist sicher richtig. Aber ich bezweifle, dass das Zählen via COUNT länger braucht.

    Einen Kommentar schreiben:


  • Cybermarco
    antwortet
    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:


  • thommyk
    antwortet
    Die Beschränkung auf weniger als alle Spalten dauert aber meistens länger als eine uneingeschränkte Query
    Mal ne Zwischenfrage: Wieso das eigentlich. Es werden doch i.d.R. weniger Daten zwischen host und client übertragen, vor allem bei großen Tabellen mit vielen Spalten.
    Oder braucht der SQL-Server länger fürs Raussuchen der Spalte?

    Einen Kommentar schreiben:


  • onemorenerd
    antwortet
    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:


  • Cybermarco
    antwortet
    Wenn ich:
    PHP-Code:
    $res mysql_query("SELECT COUNT(*) FROM tabelle WHERE spalte='hund'");
    $anzahl mysql_num_rows($res); 
    bekomm ich den Wert 1 zurück.


    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:


  • onemorenerd
    antwortet
    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 mit
    PHP-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); 
    Wenn du jedoch wissen willst, wieviele Einträge (Tupel, Zeilen) in einer bestimmten Spalte den Wert "Hund" haben, dann so:
    PHP-Code:
    $res mysql_query("SELECT COUNT(*) FROM tabelle WHERE spalte='hund'");
    $anzahl mysql_num_rows($res); 

    Einen Kommentar schreiben:


  • Cybermarco
    antwortet
    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:


  • Cybermarco
    antwortet
    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' 
    Das mit dem "show", funktioniert das überhaupt bei meinem Problem?

    Ich lese ständig in irgendwelchen tutoriasl

    select count(*) from testerone;
    bsp: Das liefert dann als Ergebnis 10
    nur wie komm ich an das Ergebnis ran?
    Zuletzt geändert von Cybermarco; 13.06.2005, 16:34.

    Einen Kommentar schreiben:


  • derHund
    antwortet
    Code:
    SHOW columns FROM table
    bitte datenbank-modell überdenken! bitte php-tags des forums verwenden.

    kannst du mal bitte dein anliegen näher erläutern?

    Einen Kommentar schreiben:


  • Cybermarco
    hat ein Thema erstellt COUNT(*) problem - mysql.

    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 Voraus
Lädt...
X