Probleme mit Gesamtzahl bei LIMIT

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

  • Probleme mit Gesamtzahl bei LIMIT

    HI Leute,
    ich habe eigentlich 2 Probleme. Ich möchte aus 2 Tablen Daten lesen. Da es relativ viele Datensätze sein können habe ich ein LIMIT $offset, 20 gesetzt um so schnellere Abfragen zu bekommen. Mein Problem ist nun, dass ich eigentliche Gesamtzahl der Datensätze wissen müsste um eine Navigation drüber laufen zu lassen.
    Das würde zwar mit einem zusätzlichen count() funktionieren, aber nach Benchmarks ist mir aufgefallen, dass die Abfragedauer verdoppelt wird. Kennt jmd. irgendeine Möglichkeit, wie das besser hinbekomme...vielleicht auch ohne LIMIT????


    Greetz,

    Bobby

  • #2
    Schau mal hier nach...
    http://www.php.net/manual/de/functio...l-num-rows.php
    mfg
    Günni


    Praxis: Jeder kann´s, aber keiner weiß wie´s geht...
    Theorie: Jeder weiß wie´s geht, aber keiner kann´s ...
    Microsoft vereint Praxis und Theorie: Nix geht und keiner weiß warum
    City-Tiger - Online durch die Straßen tigern...

    Kommentar


    • #3
      meines wissen geht das auch nur mit count().

      mache mal ein
      Code:
      SELECT count(idfeld) FROM tabelle
      also kein count(*) denn das kostet wirklich performance.

      alternativ kannst du auch das hier machen.

      PHP-Code:
      $erg=mysql_query('show table status');
      while (
      $row=mysql_fetch_array($erg,MYSQL_ASSOC))
        echo 
      $row['Name'].': '.$row['Rows'].'<br />'
      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


      Kommentar


      • #4
        Original geschrieben von Günni
        Schau mal hier nach...
        http://www.php.net/manual/de/functio...l-num-rows.php
        aber doch nur die im ergebnis. wenn er ein LIMIT xxx,20 verwendet, wird er hier doch auch nur 20 zurückbekommen. oder? wollte es jetzt nicht testen.
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          hatte ich auch schon probiert, liefert aber bsp. bei LIMIT 0,20 die Anzahl 20 zurück und nicht die Anzahl der Datensätze, die es ohne LIMIT liefern würde

          Kommentar


          • #6
            hatte ich vermutet...

            hast du das schon getestet?
            PHP-Code:
            $erg=mysql_query('show table status');
            while (
            $row=mysql_fetch_array($erg,MYSQL_ASSOC))
              echo 
            $row['Name'].': '.$row['Rows'].'<br />'
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              Original geschrieben von Abraxax
              meines wissen geht das auch nur mit count().

              mache mal ein
              Code:
              SELECT count(idfeld) FROM tabelle
              also kein count(*) denn das kostet wirklich performance.

              alternativ kannst du auch das hier machen.

              PHP-Code:
              $erg=mysql_query('show table status');
              while (
              $row=mysql_fetch_array($erg,MYSQL_ASSOC))
                echo 
              $row['Name'].': '.$row['Rows'].'<br />'
              das Problem bei dem count(*) ist, dass der komplette Such-SELECT nochmal auf die DB losgelassen wird ... mit dem LIMIT habe ich gehofft sehr einfach und schnell spezielle Seiten per Navigation (sowas wie: vorherige < 1 2 3 ... > letzte Seite ) machen zu können nur dafür ist eben die gesamtzahl der ergebnisse nötig ..... nur wen möglich ohne erneuten SELECT ohne das LIMIT

              Kommentar


              • #8
                Original geschrieben von Abraxax
                hatte ich vermutet...

                hast du das schon getestet?
                PHP-Code:
                $erg=mysql_query('show table status');
                while (
                $row=mysql_fetch_array($erg,MYSQL_ASSOC))
                  echo 
                $row['Name'].': '.$row['Rows'].'<br />'
                was genau macht der Befehl??? sieht ziemlich Zeitaufwendig aus

                Kommentar


                • #9
                  @Abraxax: Also da ist das manual aber anderer Meinung ... SELECT COUNT(*) FROM tabelle gehört zu den sehr schnellen Queries ... selbst mit eingrenzendem WHERE ... weil dafür nämlich ganz lecker einfach die Indizes verwendet, bzw. sogar einfach die Tabellenbeschreibung ausgelesen werden werden.

                  SHOW TABLE STATUS ließt letztlich auch nur die Tabellenbeschreibung aus ... das sollte der Query-Optimizer eben auch hinkriegen ...

                  Ein SELECT COUNT(feld) macht das nicht unbedingt schneller ... je nachdem ob das Feld indiziert ist kann's sogar langsamer werden ...

                  Anyway ... auf jeden Fall hast Du Recht, das eine Abfrage auf SELECT COUNT() ob mit Stern oder Feld nicht zu vermeiden sind, da sonst maximal der Wert des LIMIT's ermittelt wird.

                  @BobbyX: Ich würde mal Deine Query mit EXPLAIN oder DESCRIBE Analysieren ... eventuell fehlen Indizes wenn die Abfrage so lange dauert .... !
                  Zuletzt geändert von goth; 08.03.2003, 00:31.
                  carpe noctem

                  [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                  [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                  Kommentar


                  • #10
                    du sollst aber keinen count(*) machen, sondern einen count() nur auf EIN FELD was einen index hat. und das ist nunmal meist das id feld.

                    auf das WHERE , damit auch davon die korrekte gesamtmenge bekommt, wirst du nicht verzichten können. LIMIT darf auf keinen fall rein, sonst bekommst du nicht die gesamtzahl. aber durch count(feldname_mit_index) solltest du performance bekommen.

                    EDIT:
                    ich ziehe meine letzte bemerkung zurück....
                    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                    Kommentar


                    • #11
                      Original geschrieben von BobbyX
                      was genau macht der Befehl??? sieht ziemlich Zeitaufwendig aus
                      er zeigt dir sehr schnell die anzahl aller datensätze aller tabellen in der datenbank. das geht sehr fix.

                      hatte nur vorhin das WHERE überlesen. und damit ist dies für dich nicht nützlich.
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        Damit bekommst du alle Zeilen der Tabelle.
                        Genauso gut kannst du auch SELECT COUNT(*) FROM tabelle; machen.
                        das sollte sogar schneller sein.

                        Du hast aber davon gesprochen, dass du einen WHERE Klausel für die Suche hast. Poste mal die komplette Query. Also eigentlich ist die MySQL Volltextsuche doch recht schnell. Und wenn du MySQl 4 hast, ist sie nochmal viel schneller.
                        [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
                        [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
                        [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

                        © Harald Schmidt

                        Kommentar


                        • #13
                          LIMITS

                          in der WHERE Klausel ist aber eine Volltextsuche, bringt es mir da etwas wenn ich auf indizierte Felder suche?? habs auf indizierte und nicht indizierte laufen lassen, gab aber kein geschwindigkeitunterschied

                          Kommentar


                          • #14
                            Volltextsuche geht doch eh nur auf Feldern die im FULLTEXT INDEX sind ... oder?
                            carpe noctem

                            [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                            [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                            Kommentar


                            • #15
                              Klar, Volltextsuche ist nur mit einem FULLTEXT Index möglich. Eigentlich müsste die Query eine Fehlermeldung bringen, wenn die Volltextsuche auf Spalten ohne Volltextindex angewendet wird. Das wäre nur logisch.

                              @BobbyX: Ja, wir haben langsam kapiert, dass du einen WHERE Teil hast. Nun rück aber auch mal mit den Infos (sprich der kompletten Query) raus oder willst du, dass wir noch tiefer in die Kristallkugel schauen müssen?
                              [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
                              [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
                              [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

                              © Harald Schmidt

                              Kommentar

                              Lädt...
                              X