Я создаю php-сайт, используя jquery и плагин DataTables. Моя страница выложена так же, как она должна выполняться с разбивкой по страницам, но при работе с большими наборами данных я заметил, что сервер тянет ВСЕ возвращенные строки, а не 10-кратное (может быть больше) ограничение, указанное на каждой странице.
Возможно ли ограничить результаты запроса и, тем не менее, сохранить идентификационные номера этих результатов в памяти, поэтому, когда пострадает страница 2 (или номер результата изменен), запрашиваются только новые данные?
Имеет ли смысл делать это так?
Я просто не хочу запрашивать DB с 2000 возвращаемыми строками, а затем иметь "front-end-plugin", чтобы он выглядел так, как будто другие результаты скрыты, когда они правдиво на странице с самого начала.
Предложение LIMIT в SQL имеет две части - предел и смещение.
Чтобы получить первые 10 строк:
SELECT ... LIMIT 0,10
Чтобы получить следующие 10 строк:
SELECT ... LIMIT 10,10
Чтобы получить следующие 10 строк:
SELECT ... LIMIT 20,10
До тех пор, пока вы ЗАВЕРШЕНО, чтобы результат был установлен одинаковым каждый раз, вам абсолютно не нужно (и не хотеть) сначала попросить базу данных отправить вам все 2000 строк.
Чтобы отобразить подкачку в сочетании с этим, вам все равно нужно знать, сколько полных строк соответствует вашему запросу. Есть два способа справиться с этим -
1) Запросить подсчет строк с помощью отдельного запроса
SELECT COUNT(*) FROM table WHERE ...
2) Используйте подсказку SQL_CALC_FOUND_ROWS в вашем запросе, которая подскажет MySQL рассчитать, сколько строк соответствует запросу, прежде чем возвращать только 10, которые вы просили. Затем вы получаете запрос SELECT FOUND_ROWS()
для получения этого результата.
SELECT SQL_CALC_FOUND_ROWS column1, column2 ... LIMIT 0,10
2 является предпочтительным, поскольку он не добавляет дополнительный запрос к каждой загрузке страницы.
SQL_CALC_FOUND_ROWS
с множеством ошибок иSQL_CALC_FOUND_ROWS
MySQL, в том числе уничтожить любой выигрыш в производительности при выполнении предложенияLIMIT
.