Если я использую драгоценный камень will_paginate, монго-запрос все еще выбирает все строки? - PullRequest
2 голосов
/ 12 февраля 2012

Код:

Channel.all.paginate(:page => 3, :per_page => 25)

Допустим, у меня есть таблица с 400 000 записей, выбирает ли приведенный выше код все 400 000 записей, затем получает текущие 25, которые мне нужны, или запрашивает только 25, которые мне нужны.

Если он запрашивает все 400 000 записей, есть ли лучший оптимизированный способ разбивки больших наборов данных на рельсы?

1 Ответ

3 голосов
/ 12 февраля 2012

Mongo Mapper (который я предполагаю, что вы используете из-за синтаксиса вашего запроса) реализует это с помощью выражений limit и skip выражений.

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

Например: если вы были на странице 3 и у вас по 25 на страницу, запрос, который запускает mongo mapper, выглядит следующим образом:

db.channels.find().skip((page - 1) * per_page).limit(per_page)

Что означает:

db.channels.find().skip(2 * 25).limit(25)

Чтобы вернуть результаты, Mongo должен пропустить (page - 1) * per_page количество результатов, которое может быть дорогостоящим, если номер страницы большой. Допустим, выражение выражается как 1000, тогда ему нужно будет выполнить запрос, пропустить более 1000 документов и получить следующие 25 документов (ограничение). MongoDB, по сути, будет выполнять сканирование таблицы этих документов.

Чтобы избежать этого, вы можете использовать разбивку на страницы диапазона, которая обеспечивает лучшее использование индексов, но не позволяет легко переходить на определенную страницу.

Если модель канала имеет, например, поле даты, то при поиске по диапазонам вместо пропуска используются $ gte и limit. Вы должны взять дату последнего документа на странице x и получить результаты следующей страницы, запросив документы с датой $ gte окончательного документа предыдущей страницы. Если вы сделаете это, вы можете получить обманщиков, поэтому имеет смысл использовать другие критерии.

На практике не беспокойтесь об этом, если у вас не очень много страниц.

Ура и удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...