2012-04-09 10 views

risposta

33

L'approccio "salta e limita" non è molto efficiente quando si esegue il paging in un set di dati. È effettivamente un Shlemiel the Painter's algorithm.

Le query di intervallo sono molto più efficienti (se supportate dagli indici). Ad esempio, immaginiamo che stai visualizzando tweet. Le dimensioni della pagina è di 20 e sei a pagina 1000 e vuole caricare la pagina 1001.

Questa query

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

è molto meno efficiente rispetto

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

(a condizione che si avere indice su created_at).

Si ottiene l'idea: quando si carica una pagina, annotare il timestamp dell'ultimo tweet e utilizzarlo per interrogare la pagina successiva.

+1

Cosa fare se ci sono dei tweet creati contemporaneamente da utenti diversi ma devo mostrarli? –

+0

Esattamente lo stesso millisecondo? Io non la penso così –

+1

In questo caso, ordina per 'created_at: -1, user_id: 1' –

Problemi correlati