За последние 24 часа нас посетили 21977 программистов и 1002 робота. Сейчас ищет 721 программист ...

Многостраничный вывод на PHP, используя запрос к MySQL лишь один раз.

Тема в разделе "Сделайте за меня", создана пользователем bluser, 23 апр 2017.

  1. bluser

    bluser Новичок

    С нами с:
    23 апр 2017
    Сообщения:
    5
    Симпатии:
    0
    Есть большая MySQL база с множеством таблиц и в каждой таблице до 10 млн. записей ($bd).
    Некоторые SQL($sql) запросы отрабатывается по несколько минут.
    Получаем некий результат: $ result = mysqli_query ($bd, $sql).
    В отдельном файле организуется вывод данных ($ result) в таблицу htmlв цикле:
    while ($myrow= mysqli_fetch_assoc ($result)) {…}
    Получается тысячи строк.
    Задача: организовать вывод величины $ result с разбиением постранично, типа: 1 2 3 4 5 6 7 8 ... >
    ОДНАКО: НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ В ПОСТРАНИЧНОМ ВЫВОДЕ SQLЗАПРОСЫ К БАЗЕ ДАННЫХ, ТАК КАК КАЖДЫЙ ЗАПРОС И ЛЮБОЙ LIMITБУДЕТУТ ОТНИМАТЬ БОЛЬШОЕ ВРЕМЯ.

    Иными словами: запрос SQL($sql) должен случаться 1 раз, а результат этого запроса ($ result) должен разбиваться и выводиться в многостраничном формате.
     
  2. bluser

    bluser Новичок

    С нами с:
    23 апр 2017
    Сообщения:
    5
    Симпатии:
    0
    Есть большая MySQL база с множеством таблиц и в каждой таблице до 10 млн. записей ($bd).
    Некоторые SQL($sql) запросы отрабатывается по несколько минут.
    Получаем некий результат: $ result = mysqli_query ($bd, $sql).
    В отдельном файле организуется вывод данных ($ result) в таблицу htmlв цикле:
    while ($myrow= mysqli_fetch_assoc ($result)) {…}
    Получается тысячи строк.
    Задача: организовать вывод величины $ result с разбиением постранично, типа: 1 2 3 4 5 6 7 8 ... >
    ОДНАКО: НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ В ПОСТРАНИЧНОМ ВЫВОДЕ SQLЗАПРОСЫ К БАЗЕ ДАННЫХ, ТАК КАК КАЖДЫЙ ЗАПРОС И ЛЮБОЙ LIMITБУДЕТУТ ОТНИМАТЬ БОЛЬШОЕ ВРЕМЯ.

    Иными словами: запрос SQL($sql) должен случаться 1 раз, а результат этого запроса ($ result) должен разбиваться и выводиться в многостраничном формате.
     
  3. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Нужно кэшировать результаты, можно всю страницу или только запрос, можно в memcached, redis или в файл как PHP массив
     
  4. Alesto

    Alesto Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    72
    Симпатии:
    8
  5. bluser

    bluser Новичок

    С нами с:
    23 апр 2017
    Сообщения:
    5
    Симпатии:
    0
    А по конкретнее примеры на уровне php кода есть?
     
  6. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Стоит сначала проверить/исследовать оптимальность существующего решения. После чего принимать обдуманное решение для каждой конкретной ситуации.
    Просто брать и все, что медленно работает загонять в кэш - это кривая дорожка, способная привести к печальным последствиям. В один прекрасный день произойдет перезагрузка сервера и он попросту не сможет подняться, т-к разогрев кэша потребует значительных ресурсов, превышающие существующие.
     
    Fell-x27 и romach нравится это.
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    @bluser нету. Можешь просто в фоновом режиме, например через cron, для каждой страницы, данные из mysql сложить в PHP файл как массив, var_export($array, true), потом вместо того чтобы ждать выполнения запроса к базе, просто бери данные из массива который в PHP файле.

    array1.php
    PHP:
    1. <?php
    2. return [
    3.     'test' => 'hello',
    4. ];
    test.php
    PHP:
    1. <?php
    2. $data = include 'page1.php';
    3. echo $data['test'];
    --- Добавлено ---
    @t1grok да, хорошее замечание
     
  8. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Проблема в том, что на такие вещи нет серебряной пули. К примеру кэширование может быть дороже, если таблица часто меняется, если же нет, то возможно будет лучшим вариантом индексы с условиями или вообще, секционирование (хотя хз, умеет ли такое мускуль). Возможно стоит строить запрос по одной таблице, а остальные данные добирать по id доп. запросами. Может быть бд стоит денормализовать, что бы уменьшить количество join`ов в запросе. Короче, вариантов много, но конкретики ни кто не даст, т.к. все данные есть лишь у тебя. Говори конкретные кейсы, может чего и придумаем )
     
    denis01 нравится это.
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    почему?
     
  10. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Предположу, что движок делает join, а потом уже разбирает его по условиям.
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Вангую, что с индексами полная беда. Ну и да, автор, код запроса, который несколько минут выполняется, в студию.
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Можно выводить на страницу сразу все тысячи результатов, а на страницы разделить с помощью js: http://flaviusmatis.github.io/simplePagination.js/
    Браузеры стали быстрыми, компьютеры мощными.
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    И плевать, что львиная доля трафика сегодня идет с мобил!
     
  14. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А ещё лучше explain запроса )
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    С мобилки еще лучше подгрузить сразу большой кусок, потому что классический переход между страницами может занимать несколько секунд вне зависимости от выполнения скрипта.
    Если данные пихать в JSON, то хотя бы в 100кб gzip-а можно уместить десятки тысяч итемов.
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Я не трафик сейчас имел ввиду, а "компьютеры мощные, браузеры быстрые". Намекнул, что кроме мощных компьютеров с быстрыми браузерами есть клиенты, которым толстая логика с десятками тысяч итемов поперек горла стоит.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    да забейте. давайте подождём загадочный запрос, структуру бд и индексы. А потом будет от чего отталкиваться.