COUNT(*) problem - mysql

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • onemorenerd
    replied
    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.
    Last edited by onemorenerd; 14-06-2005, 10:42.

    Leave a comment:


  • TobiaZ
    replied
    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.

    Leave a comment:


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


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

    Leave a comment:


  • TobiaZ
    replied
    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.

    Leave a comment:


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


  • thommyk
    replied
    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?

    Leave a comment:


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


  • Cybermarco
    replied
    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?

    Leave a comment:


  • onemorenerd
    replied
    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); 

    Leave a comment:


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


  • Cybermarco
    replied
    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?
    Last edited by Cybermarco; 13-06-2005, 17:34.

    Leave a comment:


  • derHund
    replied
    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?

    Leave a comment:


  • Cybermarco
    started a topic 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
Working...
X