Номера страниц и общее количество результатов в нумерации страниц на основе курсора

Хотя это может показаться глупым вопросом, иногда необходимо показать номера страниц (а также последнюю страницу). Как лучше всего рассчитать общее количество строк, а также рассчитать номера страниц (предоставив запрос страницы для возврата конкретной страницы) в разбиении на страницы на основе курсора? Также возможно ли все это в одном запросе?

Популярный пример: Google показывает номера страниц в поиске Google, используя разбиение на страницы на основе курсора, а также количество строк.


person Sakibur Rahman    schedule 04.03.2021    source источник


Ответы (1)


Обратите внимание, что Google не показывает номер последней страницы.

Они показывают 1 - 10 и Next.

введите здесь описание изображения

Вверху они показывают оценку общих результатов, например:

Около 1 730 000 000 результатов (0,94 секунды)

Но это не использование SQL. При этом используется собственная технология распределенного поиска Google.

Чтобы ответить на ваш вопрос, в MySQL была функция SQL_CALC_FOUND_ROWS, которую вы могли использовать в качестве модификатора запроса в запросе SELECT с LIMIT. Затем запросите значение FOUND_ROWS(), чтобы узнать, сколько строк было бы возвращено, если бы вы не использовали LIMIT.

SELECT SQL_CALC_FOUND_ROWS ... FROM Mytable WHERE ... LIMIT 10;

SELECT FOUND_ROWS();

Однако https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows сообщает, что эта функция устарела. Оказывается, это неэффективно, и на самом деле предпочтительнее делать два запроса, один для подсчета строк, а второй запрос для возврата результатов с LIMIT.

SELECT COUNT(*) FROM Mytable WHERE ...;

SELECT ... FROM Mytable WHERE ... LIMIT 10;

Измерения производительности показаны в этом блоге: https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

person Bill Karwin    schedule 04.03.2021
comment
Не могли бы вы дать мне несколько идей о том, как вычислять номера страниц и переходить на эту страницу с помощью разбиения на страницы с помощью курсора? - person Sakibur Rahman; 05.03.2021
comment
Я не знаю, можно ли перейти на произвольную страницу при использовании разбивки на страницы с помощью курсора. Вам нужно знать идентификатор начала следующей страницы, и это доступно только в том случае, если у вас есть данные для предыдущей страницы. Чтобы перейти на произвольную страницу, вам все равно придется начать с первой страницы и прочитать все данные до нужной страницы. Это эквивалентно использованию LIMIT и OFFSET. Итак, для первой страницы, которую вы хотите, вам нужно использовать LIMIT и OFFSET. Затем, когда у вас есть эта страница, вы можете использовать разбиение на страницы с помощью курсора для просмотра последующих страниц. - person Bill Karwin; 05.03.2021
comment
Спасибо. Я так и думал. - person Sakibur Rahman; 05.03.2021