2012-04-09 1 views

ответ

33

Подход «пропустить и ограничить» не очень эффективен, когда вы перемещаетесь далеко в набор данных. Фактически это Shlemiel the Painter's algorithm.

Запросы диапазона намного эффективнее (при поддержке индексов). Например, давайте представим, что вы показываете твиты. Ваш размер страницы 20 и вы на странице 1000 и хотите загрузить страницу 1001.

Этот запрос

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

является гораздо менее эффективен, чем

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

(при условии, что вы имеют индекс на created_at).

Вы получаете идею: при загрузке страницы обратите внимание на отметку времени последнего твита и используйте ее для запроса следующей страницы.

+1

Что делать, если есть несколько твитов, созданных в то же время разными пользователями, но мне нужно их показать? –

+0

Точно такая же миллисекунда? Я так не думаю. –

+1

Если это так, выполните сортировку 'created_at: -1, user_id: 1' –

Смежные вопросы