мультизапрос или...

Тема в разделе "PHP", создана пользователем SimonSmith, 5 авг 2013.

Статус темы:
Закрыта.
Модераторы: latteo
  1. SimonSmith

    SimonSmith Постоялец

    Регистр.:
    25 сен 2008
    Сообщения:
    148
    Симпатии:
    33
    Уважаемые,
    стоит задача вывести разом 4000 рядов из базы MySQL. На ум пришли две мысли:
    1. Вывести все 4000 рядов одним селектом без лимита
    2. php рекурсия с лимитом в 500 рядов с одного селекта (8 селектов)

    Вопрос: в каком случае обработка и вывод данных окажется быстрее?
    п.с. число выводимых рядом постепенно растет.
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.116
    Симпатии:
    2.130
    Вам нужна быстрая обработка или низкая нагрузка на сервер? Определитесь - это не совместимо друг с другом.

    Вывод разом всей таблицы - быстрая, но ресурсоёмкая операция (по CPU и HDD для MySQL и RAM для PHP).
    Вывод с лимитом медленнее, но снижает нагрузку с MySQL и переводит её на PHP. При этом снимается нагрузка с HDD, переводится на CPU и RAM. В единицу времени нагрузка меньше, но суммарная - больше.

    Но вывод 4000 позиций не нужная операция. Выводите по 200-300 на страницу или через AXAJ-подгрузку по 100 за раз. Это снизит нагрузку за единицу времени в разы, распределяя её по времени.

    Вообще, есть 2 варианта всегда:
    1) Разово загрузить сервер большой нагрузкой и получить ответ быстро.
    2) Распределить нагрузку по времени, получить ответ с задержкой по времени, но без риска перегрузить сервер

    К примеру, если у Вас VDS с 100 МГц (условно) и за каждые дополнительные 10 МГц Вам надо платить - выгоднее распределять нагрузку. Если у Вас выделенный сервер, который занимается только этой операцией - есть смысл получать результат мгновенно, но с 100% загрузкой CPU/HDD/RAM.

    P.s. 4000 записи для MySQL копейки. У меня был опыт работы с большими таблицами, так 50 Мб таблицы полностью скачать и закачать обратно - 18 секунд. Операция с базой (селект) 50 000 записей - порядка 2 секунд.

    P.p.s. можно поставить эксперимент. Написать PHP-скрипт, который в цикле выполняет некую операцию, а через 30 секунд автоматом убивается. И Вы увидите, что за 30 секунд мускул успеет сделать больше 100 тысяч записей. И это в 1 поток с побочными нагрузками. В несколько потоков добивался 50 тысяч запросов в секунду, но это после дикой оптимизации сервера.
     
    SimonSmith нравится это.
Статус темы:
Закрыта.