Поиск по страницам ... сильно ли снижается производительность после N записей? - PullRequest
1 голос
/ 30 декабря 2011

Я только что попробовал следующий запрос на YouTube:

http://www.youtube.com/results?search_query=test&search=tag&page=100

и получил сообщение об ошибке:

Извините, YouTube не предоставляет более 1000 результатов по любому запросу. (Вы запрашивали результаты начиная с 2000 года.)

Я также попробовал поиск в Google для «теста», и, хотя в нем говорилось о 3,44 миллиарда результатов, я смог добраться только до страницы 82 (или около 820 результатов).

Это заставляет меня задуматься, не начинает ли производительность снижаться при поиске по страницам после N записей (особенно интересует функция ROW_NUMBER () в SQL Server или аналогичная функция в других системах БД), или YouTube / Google делают это по другим причинам? ? Конечно, маловероятно, что большинству людей нужно будет проходить мимо первых 1000 результатов для запроса, но я думаю, что ограничение специально установлено по какой-то технической причине.

Затем снова Stack Overflow позволяет пролистывать 47k результатов: https://stackoverflow.com/questions/tagged/c?page=955&sort=newest&pagesize=50

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Да.Высокие смещения медленные и неэффективные.

Единственный способ найти записи со смещением - это вычислить все записи, которые были до этого, а затем отбросить их.

(я не знаю ROW_NUMBER (), но в стандартном SQL будет LIMIT. Так

SELECT * FROM table LIMIT 1999,20

)

.. в приведенном выше примере первые 2000 записейсначала нужно получить, а затем выбросить .Как правило, он не может быть пропущен вперед или использовать индексы для перехода к правильному расположению в данных, потому что обычно существует предложение «ГДЕ», фильтрующее результаты.

Возможно кэшировать результаты, что, вероятно, и делает SO.Так что на самом деле не нужно вычислять большие смещения каждый раз.(Большинство запросов SO представляют собой «небольшой» набор известных тегов, поэтому его вполне можно кэшировать. Произвольный поисковый запрос будет иметь много версий для перехвата, что делает его непрактичным) (В качестве альтернативы может использоваться другая реализация, которая позволяетпроизвольные смещения)

Другие места, имеющие отношение к подобным вещам http://sphinxsearch.com/docs/current.html#conf-max-matches

Задняя часть теста envolope:

mysql> select gridimage_id from gridimage_search where moderation_status = "geograph" order by imagetaken limit 100999,3;
...
3 rows in set (11.32 sec)

mysql> select gridimage_id from gridimage_search where moderation_status = "geograph" order by imagetaken limit 3;
...
3 rows in set (4.59 sec)

(Произвольный запрос выбирается так, чтобы не использовать индексы оченьхорошо, если индексы можно использовать, разница менее выражена и труднее увидеть. Но в производственной системе, выполняющей много запросов, разница в 1 или 2 мс огромна)

Обновление: (для отображения индексированного запроса)

mysql> select gridimage_id from gridimage_search order by imagetaken limit 10;
...
10 rows in set (0.00 sec)

mysql> select gridimage_id from gridimage_search order by imagetaken limit 100000,10;
...
10 rows in set (1.70 sec)
0 голосов
/ 30 декабря 2011

Это предложение TOP, предназначенное для ограничения количества физических чтений, которые должна выполнять база данных, что ограничивает время, затрачиваемое на запрос.Представьте, что в вашей базе данных есть 82 миллиарда ссылок на истории о Японии.Что если кто-то спросит «Япония»?Все 82 миллиарда результатов действительно будут нажаты?Нет. Пользователю нужны 1000 самых важных результатов.Когда поиск является общим, например, «тест», нет способа определить релевантность.В этом случае YouTube / Google должен ограничить возвращаемый объем, чтобы другие пользователи не влияли на общий поиск.Что быстрее, вернуть 1000 результатов или 82 000 000 000 результатов?

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