Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Базы данных > Вопрос по оптимизации нагрузки PHP скрипта


Автор: sandland 8.12.2009, 17:00
Добрый день.
Имеется скрипт . повешенный на Cron, который проходит по довольно объемной базе данных ежедневно и обновляет некоторую информацию.
Если упростить модель, то структура БД: 3 таблицы, и получается 3 вложенных цикла

Код

$q1=mysql_query("SELECT ...");
while($r1=mysql_fetch_array($q1))
{
    $q2=mysql_query("SELECT ...");
    while($r2=mysql_fetch_array($q2))
    {
        $q3=mysql_query("SELECT ...");
        while($r3=mysql_fetch_array($q3))
        {
        // ....
        }
    }
}

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

Я решил попробовать сделать перед этими вложенными циклами просто одни Запрос : Select * from `users` WHERE 1
и распихать все значения по массивам, и  использовать эту структуру вместо постоянно делающегося запроса за каждым юзером.

Вопрос такой: какое решение наиболее оптимально использовать?

Автор: Ипатьев 8.12.2009, 17:04
оптимальнее всего делать одним запросом

Автор: SamDark 8.12.2009, 18:43
sandland
1. Проверяем флаг, говорящий, что запрос выполняется. Нужно, чтобы не запустить одновременно несколько одинаковых кронов.

2. Формируем запрос вида:
Код

SELECT1 
  JOIN
  JOIN
LIMIT X, X+C


Где X — запоминаемая после каждой отработки переменная, C — количество обрабатываемых за один раз строк.

3. Обрабатываем, запоминаем и наращиваем X: X=X+100;
4. Повторяем 1. пока запрос не вернёт пустой результат.

Автор: Pitlord 11.12.2009, 18:09
Цитата(SamDark @  8.12.2009,  18:43 Найти цитируемый пост)
LIMIT X, X+C

LIMIT X, C

Автор: nerezus 13.12.2009, 04:27
Опс, пардон, модераторы, перенесите в PHP и базы данных )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)