Предложение 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.
limit X, Y
, то, по сути, произойдет, что строки X + Y будут извлечены, а затем X строк с начала отбрасываются, и все, что осталось, возвращается. Повторим:limit X, Y
результаты сканирования X + Y строк.OFFSET
;-)Для 500 записей эффективность, вероятно, не проблема, но если у вас есть миллионы записей, то может быть полезно использовать предложение WHERE для выбора следующей страницы:
Здесь "234374" - это идентификатор последней записи с предыдущей страницы, которую вы просматривали.
Это позволит использовать индекс по идентификатору для поиска первой записи. Если вы используете,
LIMIT offset, 20
вы можете обнаружить, что он становится все медленнее и медленнее, когда вы переходите к концу. Как я уже сказал, это, вероятно, не имеет значения, если у вас есть только 200 записей, но это может иметь значение с большими наборами результатов.Еще одним преимуществом этого подхода является то, что если данные меняются между вызовами, вы не пропустите записи или получите повторную запись. Это связано с тем, что добавление или удаление строки означает, что смещение всех строк после нее изменяется. В вашем случае это, вероятно, не важно - я думаю, что ваш пул рекламы не меняется слишком часто, и в любом случае никто не заметит, получат ли они одно и то же объявление дважды подряд - но если вы ищете «лучший способ» тогда это еще одна вещь, которую следует иметь в виду при выборе того, какой подход использовать.
Если вы хотите использовать LIMIT со смещением (и это необходимо, если пользователь переходит непосредственно к странице 10000 вместо постраничного перемещения по страницам по одной), вы можете прочитать эту статью о поиске в последних строках, чтобы повысить производительность LIMIT с большим смещение.
источник
limit 1000000, 10
и надежда на то, что это сработает, ни к чему вас не приведет.area=width*height
не только количество записей может иметь значение, но и размер каждой записи также является фактором при сохранении результатов в памятиОпределите СМЕЩЕНИЕ для запроса. Например
страница 1 - (записи 01-10): смещение = 0, предел = 10;
страница 2 - (записи 11-20) смещение = 10, предел = 10;
и используйте следующий запрос:
пример для страницы 2:
источник
Есть литература об этом:
Оптимизировано разбиение на страницы с использованием MySQL , что делает разницу между подсчетом общего количества строк и разбиением на страницы.
Эффективное разбиение на страницы с использованием MySQL от Yahoo Inc. на Percona Performance Conference 2009. Команда Percona MySQL предоставляет его также в виде видео на Youtube: Эффективное разбиение на страницы с использованием MySQL (видео) ,
Основная проблема происходит с использованием больших
OFFSET
с. Они избегают использованияOFFSET
с различными методами, начиная отid
выбора диапазона вWHERE
предложении, до некоторого рода страниц кэширования или предварительного вычисления.Есть предложения по использованию в INDEX, Люк :
« Пейджинг через результаты ».
« Нумерация страниц сделана правильно ».
источник
Этот урок показывает отличный способ сделать нумерацию страниц. Эффективное разбиение на страницы с использованием MySQL
Короче говоря, избегайте использования OFFSET или большого LIMIT
источник
Вы также можете сделать
Количество строк в операторе выбора (без ограничения) фиксируется в том же операторе выбора, поэтому вам не нужно снова запрашивать размер таблицы. Вы получаете количество строк, используя SELECT FOUND_ROWS ();
источник
*
результаты в более столбцов , чем это необходимо , извлекаемых, существо иSQL_CALC_FOUND_ROWS
результаты в тех столбцах , которые считываются с всех строк в таблице, даже если они не включены в результат. Было бы намного эффективнее рассчитать количество строк в отдельном запросе, который не читает все эти столбцы. Тогда ваш основной запрос может остановиться после прочтения 20 строк.Запрос 1:
SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500
Запрос 2:
SELECT * FROM tbl LIMIT 0,500;
Запрос 1 выполняется быстрее с небольшими или средними записями, если число записей равно 5000 или выше, результат аналогичен.
Результат на 500 записей:
Запрос1 занимает 9.9999904632568 миллисекунд
Query2 занимает 19,9999980926514 миллисекунд
Результат для 8000 записей:
Запрос1 занимает 129,99987602234 миллисекунд
Запрос2 занимает 160.00008583069 миллисекунд
источник
id
.id > 0
полезно?offset
(первый аргумент для limit является смещением), вы по-прежнему выбираете все данные для ограничения, затем отбрасываете эту величину смещения, а затем возвращаете секцию, которая находится междуoffset
иlimit
. с помощьюwhere
предложения, с другой стороны, вы задаете своего рода начальную точку для запроса и запрашиваетеONLY
эту конкретную часть.Пейджинг прост, когда он извлекает данные из одной таблицы, но он сложен, когда извлекает данные, объединяющие несколько таблиц. Вот хороший пример с MySql и Spring:
https://www.easycodeforall.com/zpagination1.jsp
источник