Как эффективно нумеровать страницы большие наборы данных с PHP и MySQL?

Здесь использует всего одну команду без ЗАВИХРЕНИЯ. Супер простой.

echo file_get_contents('https://www.server.com', false, stream_context_create([
    'http' => [
        'method' => 'POST',
        'header'  => "Content-type: application/x-www-form-urlencoded",
        'content' => http_build_query([
            'key1' => 'Hello world!'
        ])
    ]
]));
7
задан secondtruth 4 February 2013 в 14:55
поделиться

6 ответов

Решение могло бы состоять в том, чтобы не использовать предложение limit, а вместо этого использовать соединение - объединение таблицы, используемой как некоторая последовательность.

Для получения дополнительной информации о SO, I нашел этот вопрос / ответ , который дает пример - который может вам помочь; -)

1
ответ дан 7 December 2019 в 01:24
поделиться

Прежде всего, если вы хотите разбить на страницы, вам обязательно нужно иметь предложение ORDER BY. Затем вам просто нужно использовать это предложение, чтобы глубже изучить свой набор данных. Например, рассмотрим следующее:

SELECT * FROM my_table ORDER BY id LIMIT 20

У вас будут первые 20 записей, допустим, их идентификаторы: 5,8,9, ..., 55,64. Ваша пагинационная ссылка на страницу 2 будет выглядеть как "list.php? Page = 2 & id = 64", а ваш запрос будет иметь вид

SELECT * FROM my_table WHERE id > 64 ORDER BY id LIMIT 20

Без смещения, прочитано только 20 записей. Это не позволяет вам произвольно переходить на любую страницу, но в большинстве случаев люди просто просматривают следующую / предыдущую страницу. Индекс на «id» улучшит производительность даже при больших значениях OFFSET.

7
ответ дан 7 December 2019 в 01:24
поделиться

В основном есть 3 подхода к этому, каждый из которых имеет свои собственные компромиссы:

  1. Отправить все 10000 записей клиенту и обрабатывать пагинацию на стороне клиента с помощью Javascript или тому подобного. . Очевидное преимущество состоит в том, что для всех записей необходим только один запрос; очевидным недостатком является то, что если размер записи в какой-либо мере значительный, размер страницы, отправляемой в браузер, будет пропорциональным, и пользователю может быть не важен полный набор записей.

  2. Делайте то, что вы в настоящее время выполняется, а именно SQL LIMIT, и захватывать только те записи, которые вам нужны, с каждым запросом, полностью без сохранения состояния. Преимущество в том, что он отправляет записи только для запрашиваемой в данный момент страницы, поэтому запросы небольшие, а недостатки в том, что: а) требуется запрос сервера для каждой страницы и б) это ' s медленнее по мере увеличения количества записей / страниц для последующих страниц в результате, как вы упомянули. Использование предложения JOIN или WHERE в монотонно увеличивающемся поле id иногда может помочь в этом отношении, особенно если вы запрашиваете результаты из статической таблицы, а не из динамического запроса.

  3. Поддерживайте какой-то объект состояния на сервере который кэширует результаты запроса и может использоваться в будущих запросах в течение ограниченного периода времени. Плюс в том, что у него лучшая скорость запроса, поскольку фактический запрос должен выполняться только один раз; Обратной стороной является необходимость управлять / хранить / очищать эти объекты состояния (особенно неприятно для веб-сайтов с высоким трафиком).

1
ответ дан 7 December 2019 в 01:24
поделиться

Я не знаю о том снижении производительности, о котором вы упомянули, и я не знаю другого решения для разбивки на страницы, однако предложение ORDER BY может помочь вам сократить время загрузки.

0
ответ дан 7 December 2019 в 01:24
поделиться

некоторые другие параметры,

  • Разделите таблицы на каждую страницу так, чтобы игнорировать ограничение.
  • Сохраните результаты в сеансе (хорошей идеей было бы создать хэш этих данных с использованием md5, затем с использованием этого кеша сеанс для нескольких пользователей)
0
ответ дан 7 December 2019 в 01:24
поделиться

Лучший способ - определить поле индекса в my_table и для каждой новой вставленной строки вам нужно увеличивать это поле. И в конце концов вам нужно использовать WHERE YOUR_INDEX_FIELD BETWEEN 10000 И 10020 Это будет намного быстрее.

0
ответ дан 7 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: