Подтвердить что ты не робот

MySQL Data - лучший способ реализовать пейджинг?

Мое приложение iPhone подключается к моей веб-службе PHP для извлечения данных из базы данных MySQL. Запрос может вернуть 500 результатов.

Каков наилучший способ реализации поискового вызова и извлечения 20 элементов за раз?

Скажем, я получаю первые 20 объявлений из своей базы данных. Теперь, как я могу запросить следующие 20 объявлений?

4b9b3361

Ответ 1

Из документации по MySQL:

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

С двумя аргументами первый аргумент указывает смещение первой строки для возврата, а второй указывает максимальное количество возвращаемых строк. Смещение начальной строки равно 0 (не 1):

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

Чтобы получить все строки с определенного смещения до конца результирующего набора, вы можете использовать некоторое большое число для второго параметра. Этот оператор извлекает все строки из 96-й строки до последней:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

С помощью одного аргумента значение указывает количество строк, возвращаемых с начала набора результатов:

SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows

Другими словами, LIMIT row_count эквивалентен LIMIT 0, row_count.

Ответ 2

Для эффективности 500 записей, вероятно, не проблема, но если у вас есть миллионы записей, может быть выгодно использовать предложение WHERE для выбора следующей страницы:

SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20

"234374" здесь - это идентификатор последней записи с предыдущей страницы, которую вы просмотрели.

Это позволит использовать индекс для идентификатора для поиска первой записи. Если вы используете LIMIT offset, 20, вы можете обнаружить, что он становится все медленнее и медленнее, когда вы продвигаетесь вперед. Как я уже сказал, это, вероятно, не имеет значения, если у вас всего 200 записей, но это может повлиять на большие результирующие наборы.

Другим преимуществом такого подхода является то, что если данные изменяются между вызовами, вы не пропустите записи или не получите повторную запись. Это связано с тем, что добавление или удаление строки означает, что смещение всех строк после ее изменения. В вашем случае это, вероятно, не важно - я думаю, ваш пул объявлений не меняется слишком часто, и в любом случае никто не заметит, если они получат одно и то же объявление дважды подряд, но если вы ищете "лучший способ", то это еще одна вещь, которую следует иметь в виду при выборе того, какой подход использовать.

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

Ответ 4

Там есть литература:

Основная проблема возникает при использовании больших OFFSET s. Они избегают использования OFFSET с различными методами, начиная от id диапазона выбора в предложении WHERE, до каких-либо страниц кэширования или предварительного вычисления.

Предлагаются решения в Использование INDEX, Luke:

Ответ 5

Определите СМЕЩЕНИЕ для запроса. Например

стр. 1 - (записи 01-10): offset = 0, limit = 10;

стр. 2 - (записи 11-20) offset = 10, limit = 10;

и используйте следующий запрос:

SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};

пример для страницы 2:

SELECT column FROM table
LIMIT 10 OFFSET 10;

Ответ 6

вы также можете сделать

SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20

Счет строки для оператора select (без ограничения) записывается в одном и том же предложении выбора, так что вам больше не нужно запрашивать размер таблицы. Вы получаете количество строк, используя SELECT FOUND_ROWS();

Ответ 7

Запрос 1: SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500

Запрос 2: SELECT * FROM tbl LIMIT 0,500;

Запрос 1 работает быстрее с малыми или средними записями, если количество записей равно 5000 или выше, результат схож.

Результат для 500 записей:

Query1 принимает 9.9999904632568 миллисекунд

Query2 принимает 19.999980926514 миллисекунд

Результат для 8000 записей:

Query1 принимает 129.99987602234 миллисекунд

Query2 принимает 160.00008583069 миллисекунд