2012-04-09 5 views

Antwort

33

"Überspringen und begrenzen" -Ansatz ist nicht sehr effizient, wenn Sie weit in Datensatz blättern. Es ist effektiv ein Shlemiel the Painter's algorithm.

Bereichsabfragen sind viel effizienter (wenn sie von Indizes unterstützt werden). Stellen wir uns zum Beispiel vor, dass Sie Tweets anzeigen. Ihre Seitengröße ist 20 und Sie sind auf Seite 1000 und möchten Seite 1001.

, dass Sie diese Abfrage

db.tweets.find().sort({created_at: -1}).skip(1001*20).limit(20) 

ist viel weniger effizient als

db.tweets.find({created_at: {$lt: last_displayed_date}}). 
      sort({created_at: -1}).limit(20); 

(zur Verfügung gestellt laden haben Index auf created_at).

Sie erhalten die Idee: Wenn Sie eine Seite laden, notieren Sie sich den Zeitstempel des letzten Tweets und verwenden Sie ihn, um die nächste Seite abzufragen.

+1

Was ist zu tun, wenn einige Tweets gleichzeitig von verschiedenen Benutzern erstellt werden, aber ich sie zeigen muss? –

+0

Genau die gleiche Millisekunde? Ich denke nicht. –

+1

Wenn das der Fall ist, sortieren nach 'created_at: -1, user_id: 1' –