Moin nochmal!
die rote Fehlerlampe rotiert schon wieder. Au weia.
Tja... :)
Ich will deinen Ansatz auch noch mal grundsätzlich ins Wanken bringen:
Wie sinnvoll ist es denn, in einer 1,5 Mio Datensätze umfassenden Datenbank die Einträge _einzeln_ durchzublättern? Sowas wird man doch eher nicht tun wollen, oder? Da sollten andere Strategien ins Spiel kommen, die den direkten Zugriff auf einen einzelnen Datensatz ermöglichen - das Durchblättern aller "Meiers" ist es sicherlich nicht.
Wenns aber darum geht, gewisse Daten durchzublättern, und die Datenbank kann sich während des Blätterns ändern (Datensätze verschwinden, werden ergänzt, werden geändert), dann hast du ohnehin verloren beim Blättern, wenn du immer wieder den irgendwie definierten "nächsten" Datensatz abfragst. Denn dann kommt das blättern durcheinander, egal wie du deine Abfrage nun gestaltest. Dürfte auch klar sein, daß das unvermeidbar ist.
Mir erscheint es in diesem Fall eher sinnvoll, lieber gleich alle Ergebnisse der Datenbank (möglichst mit einem Filter versehen, der hinreichend viele Einträge wegfiltert, so daß nur noch wenige Ergebnisse übrigbleiben) in eine HTML-Seite auszugeben und dann Javascript zu nutzen, um zu blättern. Geht viel schneller.
für PREVIOUS:
Select Kunde, ID from kontakte where ID < 19 order by kunde,id Desc limit 1
ich müßte also nach "where kunde+ID < letzterKunde+ID ..." abfragen
(Pseudecode)
Geht das überhaupt? kann man in der whereklausel zwei Felder als Strings addieren?
Du mußt dir derzeit die zuletzt benutzte ID merken. Abstrahiere (wie ich schon mindestens drei Postings lang fordere :) ) und merke dir stattdessen die Eintragsnummer in der Ergebnisliste, und filtere durch LIMIT x,y genau einen oder auch mehrere Einträge der Ergebnisliste heraus. Wenn derzeit der zweite Eintrag angezeigt wird, ist der nächste Eintrag Nummer 3. Egal was die Datenbank für Daten gespeichert hat.
Dadurch kannst du nämlich ganz prima Initialisierungswerte festlegen: Der erste Eintrag, der gezeigt werden soll, ist immer Nummer 1. Wenn durchs blättern Eintrag Nummer 0 angezeigt werden soll, ist das eher doof, und wenn mehr als die vorhandenen Einträge angezeigt werden sollen, ist das ebenfalls doof und sollte korrigiert werden.
In diesem Zusammenhang mein Tipp: Um nicht über das Ende der Datenbank hinauszublättern, habe ich mal bei einer Suchmaschine ganz billig immer einen Datensatz mehr im LIMIT angefordert, als ich pro Seite ausgeben wollte. Wenn dieser Extra-Datensatz existiert, gibts einen Button "Nächste Seite", ansonsten nicht.
Ich frage mich, was dich davon abhält, einfach solch einen Zähler/Zeiger einzubauen.
Ich bastel noch ein bisschen. Ich will vor allem, das das Resultset nicht wächst bis zum Abwinken.
Wie groß darf das denn werden? Wird das auch auf die Platte ausgelagert, wenn es zu groß wird? Da stehen ja wohl nur Zeiger auf die eigentlichen Daten drin, oder? Dann wären es aber immer noch mindestens 8 Byte pro Feld, das man selected hat.
Ich kann dir leider keine Tipps für die Gestaltung extrem großer Datenbanken geben, weil ich solche noch nie selbst benutzt oder erstellt habe. Im Zweifel ist deine Einflußnahme auf die Datenbank eher gering, und du mußt "nur" entsprechend ausgestattete Hardware und natürlich die für die Aufgabe passende Software zur Verfügung stellen. :) Toll, wie einfach doch Technik ist, oder? ;)
Das einzige, was ich dir sagen kann und schon sage ist, wie ich dein Problem lösen würde - weil es nach meinen Erfahrungen mit SQL so sehr gut geht. Ok, TIMTOWTDI gilt natürlich, aber ich würde zuerst mal den ersten Gedanken verfolgen und bei Performanceproblemen dann über Alternativen nachdenken, nicht vorher.
Du kommst um einen Punkt nämlich nicht herum: Wenn du eine sortierte Datenbanktabelle durchblättern willst, wirst du immer die gesamte Datenbanktabelle abfragen müssen, weil nur so die Datenbank feststellen kann, welches Element das nächste in der Liste ist - es sei denn, du kennst dessen ID und kannst direkt darauf zugreifen (also z.B. einfach nicht nur das nächste, sondern auch das übernächste Element abfragen, dieses aber noch nicht anzeigen). Dann hast du aber das Problem, daß du dessen Nachfolger nicht kennst und letztendlich doch immer wieder die komplette Datenbanktabelle nach der aktuellen Reihenfolge der Datensätze befragen mußt.
Du hast also die Wahl: Entweder die Datenbank quälen und für jede Datensatzanzeige Zugriff auf die gesamte Tabelle, oder einmal Zugriff auf die gesamte Tabelle, dabei aber nur die IDs abfragen und als Reihenfolge irgendwo speichern - und Blätterzugriffe dann nur als "WHERE ID=$ID", was ziemlich schnell gehen dürfte. Dabei mußt du nur irgendwie dafür sorgen, daß 1,5 Mio IDs in ihrer Reihenfolge irgendwo abgespeichert und den jeweiligen Blätterscripten auch übergeben werden. IMO der eher unelegante Weg.
- Sven Rautenberg