2012-04-09 24 views

Respuesta

33

El enfoque de "omitir y limitar" no es muy eficiente cuando se busca mucho en el conjunto de datos. Es efectivamente un Shlemiel the Painter's algorithm.

Las consultas de rango son mucho más eficientes (cuando son soportadas por índices). Por ejemplo, imaginemos que está mostrando tweets. El tamaño de página es 20 y que está en la página 1000 y quiere cargar la página 1001.

Esta consulta

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

es mucho menos eficiente que

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

(siempre que se tener índice en created_at).

Se entiende la idea: cuando carga una página, anote la marca de tiempo del último tweet y utilícela para consultar la página siguiente.

+1

¿Qué hacer si hay varios tweets creados al mismo tiempo por diferentes usuarios pero debo mostrarlos? –

+0

¿Exactamente el mismo milisegundo? No lo creo. –

+1

Si ese es el caso, ordene por 'created_at: -1, user_id: 1' –

Cuestiones relacionadas