COUNT(*) problem - mysql

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

  • 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

  • #2
    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?
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      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.

      Kommentar


      • #4
        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

        Kommentar


        • #5
          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); 

          Kommentar


          • #6
            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?

            Kommentar


            • #7
              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.

              Kommentar


              • #8
                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?
                Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

                Kommentar


                • #9
                  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

                  Kommentar


                  • #10
                    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.

                    Kommentar


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

                      Kommentar


                      • #12
                        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

                        Kommentar


                        • #13
                          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.

                          Kommentar


                          • #14
                            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.

                            Kommentar

                            Lädt...
                            X