2008-08-27 14 views
6

Es ist eines dieser Dinge, die eine seltsame Kurve zu haben scheint, je mehr ich darüber nachdenke, desto sinnvoller ist es. Zu einem gewissen Grad natürlich. Und dann macht es mir überhaupt keinen Sinn.Warum ist Paginierung so ressourcenintensiv?

Pflege mich zu erleuchten?

Antwort

18

Da müssen Sie in den meisten Fällen zuerst Ihre Ergebnisse sortieren. Zum Beispiel, wenn Sie auf Google suchen, you can view only up to 100 pages of results. Sie kümmern sich nicht um die Sortierung nach 1000 Seiten für ein bestimmtes Keyword (oder eine Kombination von Keywords).

Paginierung ist schnell. Die Sortierung ist langsam.

2

Dies ist eine sehr vage Frage. Wir brauchen ein konkretes Beispiel, um eine bessere Vorstellung von dem Problem zu bekommen.

+2

Wenn Sie sich den Titel anschauen, macht die Frage Sinn, wenn Sie die Frage selbst lesen, hört sie auf, Sinn zu ergeben. –

3

Lubos ist richtig, das Problem ist nicht die Tatsache ist, dass Sie Paging (die eine große Menge an Daten aus der Leitung kommt), sondern dass Sie brauchen, um herauszufinden, was tatsächlich auf der Seite wird ..

Die Tatsache, dass Sie pagen müssen, gibt es eine Menge Daten. Viele Daten brauchen viel Zeit zum sortieren :)

1

Ich dachte, du meinst pagination of the printed page - da habe ich mir die Zähne geschnitten. Ich wollte einen großartigen Monolog über das Sammeln aller Inhalte für die Seite, die Positionierung (eine Vielzahl von Regeln hier, die Contrail-Engines sind ziemlich hilfreich) und die Rechtfertigung ... einreichen, aber anscheinend hast du über den Prozess der Organisation von Informationen auf Webseiten gesprochen .

Dafür würde ich Datenbankhits schätzen. Der Festplattenzugriff ist langsam. Sobald Sie es in Erinnerung haben, ist das Sortieren billig.

0

Natürlich dauert die Sortierung nach einer zufälligen Abfrage einige Zeit, aber wenn Sie Probleme mit derselben paginierten Abfrage haben, die regelmäßig verwendet wird, stimmt entweder das Datenbanksetup nicht (keine oder keine Indexierung) usw. Ich bin kein Db-Manager) oder Sie tun Paginierung ernsthaft falsch:

Schrecklich falsch: zB Doing select * from hugetable where somecondition; in ein Array bekommen die Anzahl der Seiten mit dem array.length wählen Sie die relevanten Indizes und dicard das Array - dann wiederholen Sie dies für jede Seite ... Das ist, was ich ernst falsch nenne.

Die bessere Lösung zwei Abfragen: eine erhält nur die Zählung, dann eine andere bekommen Ergebnisse mit limit und offset. (Einige proprietäre Nicht-Standard-SQL-Server haben möglicherweise eine Abfrage Option, ich weiß nicht)

Die schlechte Lösung kann eigentlich ganz okay in kleine Tabellen (in der Tat ist es nicht undenkbar, dass es schneller auf sehr kleine Tabellen ist, weil die Overhead von zwei Abfragen ist größer als alle Zeilen in einer Abfrage zu bekommen.Ich sage es nicht ist so ...) aber sobald die Datenbank beginnt zu wachsen, werden die Probleme offensichtlich.

+0

Die Kombination von LIMIT mit einem großen Offset und ORDER BY oder GROUP BY kann immer noch sehr ressourcenintensiv sein, weshalb Google keine vollständige Zählung (etwas über 1000 Ergebnisse und es ist eine "Schätzung") noch Paginat erhalten über die ersten 1000 Ergebnisse hinaus. – thomasrutter

2

Diese Frage scheint ziemlich gut abgedeckt, aber ich werde ein wenig etwas MySQL spezifische hinzufügen, da es eine Menge Leute, fängt heraus:

Vermeiden Sie SQL_CALC_FOUND_ROWS. Wenn das Dataset nicht trivial ist, wird das Zählen von Übereinstimmungen und das Abrufen von x Übereinstimmungsmengen in zwei getrennten Abfragen viel schneller sein. (Wenn es trivial ist, werden Sie kaum einen Unterschied bemerken, egal wie.)

+2

Ein lässiges Stöbern durch SO nach dem Abendessen, ein faszinierender Tipp, ein 10-Minuten-Test und dann ein 10-minütiger Tweak, et voila, meine Datenbank wird auf meiner schwersten Seite halbiert! Vielen Dank! – jTresidder

+0

Es ist ein guter Tipp. Das Zählen in einer anderen Abfrage kann ohne das Abrufen von Zeilendaten zählen und kann nur Indizes verwenden. Funktioniert es jedoch genauso gut in InnoDb wie in MyIsam? Ich habe das komische Gefühl, dass es anders ist, aber könnte falsch liegen. – thomasrutter