[MySQL 4.0] Count(*) dauert zu lange

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

  • [MySQL 4.0] Count(*) dauert zu lange

    Hallo,

    ich habe in meiner MySQL-DB zwei tabellen mit jeweils so 150.000 Datensätzen. Wenn ich diese joine kommen ca. 145.000 Datensätze alsm resukltset heraus. In meiner PHP-Applikation setze ich erstmal ein count(*) ab um zu sehen wieviele Datensätze nun rauskommen, und da beginnt das Problem.
    Der count(*) Aufruf benötigt über 5 sekunden. Das sieht natürlich nicht gut aus in einer Anwendung die ansonsten sehr schnell ist.

    Wie kann ich mysql optimieren dass dieser wirklich einfache Aufruf schneller geht?

    Bin für jede Hilfe dankbar!

    Viele Grüße

    Profiling

  • #2
    count() ist eine skalare funktion und wertet jeden ausdruck/zeile einzeln aus. und wenn du count(*) machst, dann geht er alle 145.000 datensätze + die spaltenanzahl durch und das mal ausgerechnet bei z.b. 12 spalten (145.000*12=1.740.000)? sei froh, dass es nur 5 sekunden dauert. setze dein count nur auf eine spalte. also z.b. count(id) from irgendwas. dann sollte alles ganz normal und flott funktionieren.
    oh man, jungs vergesst dieses scheiß *.
    ich geh zum lachen in den keller

    Kommentar


    • #3
      Hallo,

      count(id) hatte ich schon versucht, aber es gab keinen merklichen unterschied.

      Profiling

      Kommentar


      • #4
        wie sieht denn deine db-struktur aus und deine query?
        ich geh zum lachen in den keller

        Kommentar


        • #5
          Die struktur ist einfach:

          eine Tabelle A (insgesamt 16 Spalten) mit ID als primary key

          die andere Tabelle B (mit 8 Spalten) mit ID als primary key und einer spalte A_ID. Auf A_ID liegt ein index.

          der select ist:

          select count(A.ID) from A,B where A.ID = B.A_ID;

          Also so gesehen nichts besonderes.

          Kommentar


          • #6
            jo, da hast du recht, nicht wirklich was besonderes. ich kann dir da auch nicht sagen, wieso das so lange dauert, wenn du count nur auf die id machst.
            das einzigste, was ich noch probieren würde ist, vorher eine tabelle zu erstellen, die die eigenschaft A.ID = B.A_ID hat und dann das count auf diese neue tabelle zu setzen und zu gucken, ob es dann schneller geht. vielleicht ist count ja auf eine fertige tabelle schneller, als auf eine, die aktiv zusammengesetzt wird. kann ich mir zwar nicht vorstellen, doch man könnte es probieren.
            ich geh zum lachen in den keller

            Kommentar


            • #7
              Zwischenfrage: Gibt es in A überhaupt Datensätze ohne passendes B? Wenn nicht, wäre [color=green]select count(ID) from A[/color] sicher schneller.

              Ansonsten könnte ein zusätzliches Feld in A, dass die Anzahl der passenden Datensätze in B enthält, die Sache beschleunigen.
              [color=green]select sum(B_COUNT) from A[/color] bzw. (evtl. anderes Ergebnis) [color=green]select count(ID) from A where B_COUNT>0[/color]
              mein Sport: mein Frühstück: meine Arbeit:

              Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

              Kommentar


              • #8
                ja, gibt es

                außerdem werden in der Applikation noch weitere Tabellen angezogen und mit B gejoind. Je nach Einstellungen werden noch Einschränkungen auf Feldern vorgenommen. Da in der Applikation nur ein paar Datensätze angezeigt werden, wird eben mit count ermittelt wie groß der eigentliche Resultset wäre. Sind noch keine Einschränkungen vorgenommen, kommt eben das "große" Resultat.

                Bei der suche, was nun so lange läuft, haben wir eben diesen Teil des counts identifiziert.
                Ich gehe davon aus, dass dies eben viel schneller gehen müsste. Die Frage ist nun wie kann ich MySQL dazu animieren dort zu optimieren, Tabellen chachen oder sonstwas ...

                Kommentar


                • #9
                  soweit ich weiß, kannst du das direkt nicht beeinflussen. ich lass mich aber auch gerne belehren.
                  aber wenn du vorher noch andere tabellen mit b joinst, dann bist du dir wirklich sicher, dass count so lange braucht und nicht das zusammensetzen der zu zählenden tabelle?

                  @titus
                  hast du grad mal zufällig ne tabelle mit ein paar einträgen da (ich hab nicht das entsprechende datenvolumen)? dann könntest du ja mal in phpmyadmin ein count absetzen und schauen, wie lange die query braucht.
                  ich geh zum lachen in den keller

                  Kommentar


                  • #10
                    Original geschrieben von Profiling

                    select count(A.ID) from A,B where A.ID = B.A_ID;

                    besser:

                    select count(A.ID) from A inner join B on A.ID = B.A_ID

                    Kommentar


                    • #11
                      auch das ward getestet und brachte keine Vorteile ... leider ...

                      Kommentar

                      Lädt...
                      X