Frage

Ich versuche, die Ergebnisse einer SQL-Abfrage zur Verwendung auf einer Webseite zu paginieren.Die Sprache und das Datenbank-Backend sind PHP und SQLite.

Der Code, den ich verwende, funktioniert ungefähr so ​​(Seitennummerierung beginnt bei 0)

http://example.com/table?page=0

page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results

Gibt es effizientere Möglichkeiten zur Paginierung als diese?

Ein Problem, das ich bei meiner aktuellen Methode sehe, ist, dass ich alle 10 (oder wie viele) Ergebnisse im Speicher speichern muss, bevor ich mit der Anzeige beginne.Ich mache das, weil PDO nicht garantiert, dass die Zeilenanzahl verfügbar ist.

Ist es effizienter, eine auszustellen? COUNT(*) Abfrage durchführen, um zu erfahren, wie viele Zeilen vorhanden sind, und dann die Ergebnisse an den Browser streamen?

Ist dies einer dieser „Es hängt von der Größe Ihres Tisches ab und davon, ob …“ count(*) Die Abfrage erfordert einen vollständigen Tabellenscan im Datenbank-Backend. Fragen vom Typ „Machen Sie ein Profil für sich selbst“?

War es hilfreich?

Lösung

Ich würde vorschlagen, zuerst die Zählung durchzuführen.Eine Anzahl (Primärschlüssel) ist eine sehr effiziente Abfrage.

Andere Tipps

Ich habe mich für die Abfragemethode COUNT(*) two entschieden, da ich damit einen Link direkt zur letzten Seite erstellen kann, was mit der anderen Methode nicht möglich ist.Wenn ich zuerst die Zählung durchführe, kann ich die Ergebnisse auch streamen und sollte daher bei einer höheren Anzahl von Datensätzen mit weniger Speicher gut funktionieren.

Die Konsistenz zwischen den Seiten ist für mich kein Problem.Ich danke Ihnen für Ihre Hilfe.

Es gibt mehrere Fälle, in denen ich eine ziemlich komplexe Abfrage (9-12 Tabellenverknüpfung) habe, die viele tausend Zeilen zurückgibt, die ich paginieren muss.Für eine gute Paginierung müssen Sie natürlich die Gesamtgröße des Ergebnisses kennen.Bei MySQL-Datenbanken kann Ihnen die Verwendung der SQL_CALC_FOUND_ROWS-Direktive in der SELECT-Anweisung dabei helfen, dies einfacher zu erreichen. Es ist jedoch unklar, ob dies für Sie effizienter ist.

Da Sie jedoch SQLite verwenden, empfehle ich, beim Ansatz mit zwei Abfragen zu bleiben. Hier ist ein sehr prägnanter Thread zu diesem Thema.

Ich bezweifle, dass es für Ihre Benutzer ein Problem sein wird, darauf zu warten, dass das Backend zehn Zeilen zurückgibt.(Sie können dies wieder gut machen, indem Sie die Bildabmessungen gut angeben, den Webserver nach Möglichkeit komprimierte Datenübertragungen aushandeln lassen usw.)

Ich glaube nicht, dass es für Sie sehr nützlich sein wird, zunächst eine Zählung(*) durchzuführen.

Wenn Sie eine komplizierte Codierung vornehmen möchten:Wenn der Benutzer Seite x betrachtet, verwenden Sie Ajax-ähnliche Magie, um Seite x+1 vorab zu laden, um die Benutzererfahrung zu verbessern.

Ein allgemeiner Hinweis zur Paginierung:Wenn sich die Daten ändern, während der Benutzer Ihre Seiten durchsucht, ist dies der Fall Mai kann ein Problem sein, wenn Ihre Lösung ein sehr hohes Maß an Konsistenz erfordert.Ich habe dazu eine Notiz geschrieben anderswo.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top