Долгий запрос MySQL

Проблемы/вопросы, связанные с запуском под различными платформами и конфигурациями.

Модератор: immortal

Ответить
PAV
Сообщения: 970
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва

Долгий запрос MySQL

Сообщение PAV »

Вот такой запрос занимает 78 секунд, учитывая, что выполняется каждую минуту - ошибки.
Что такое может быть - куда копать?

Код: Выделить всё

$objects=SQLSelect("SELECT TITLE FROM objects");
 $total=count($objects);
 for($i=0;$i<$total;$i++) {
 
    if (gg($objects[$i]['TITLE'].'.IP')) {
       if ((gg($objects[$i]['TITLE'].'.IP'))>0){
                 
    if (ping(gg($objects[$i]['TITLE'].'.IP'))) {
         callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
        
    } else {// если 0
     
        if (ping(gg($objects[$i]['TITLE'].'.IP'))) {
        callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
        }else{
            if (ping(gg($objects[$i]['TITLE'].'.IP'))) {
            callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
            }else{
            callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>0));
            }
    
    
    
        }
    } 
   }
 
  } 
}
До переустановки системы все работало нормально.
Аватара пользователя
xor
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

Re: Долгий запрос MySQL

Сообщение xor »

Ну, дело, всё-таки, не в mySQL-запросе, а в куче пингов в цикле.

Код: Выделить всё

$objects=SQLSelect("SELECT TITLE FROM objects");
 $total=count($objects);
 for($i=0;$i<$total;$i++) {  //Вы перебираете все объекты в системе
 
    if (gg($objects[$i]['TITLE'].'.IP')) { //смотрите на наличие свойства айпи
       if ((gg($objects[$i]['TITLE'].'.IP'))>0){ //есть свойство
                 
    if (ping(gg($objects[$i]['TITLE'].'.IP'))) { //пингуете этот объект
         callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
        
    } else {// если 0 //пинг не прошёл(
     
        if (ping(gg($objects[$i]['TITLE'].'.IP'))) { //снова пингуете этот же объект
        callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
        }else{ //пинг не прошёл(
            if (ping(gg($objects[$i]['TITLE'].'.IP'))) { //снова пингуете этот же объект
            callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>1));
            }else{
            callMethod($objects[$i]['TITLE'].'.statusChanged',array("value"=>0));//тут Вы сдаетесь и переходите к следующему объекту
            }
    
    
    
        }
    } 
   }
 
  } 
}

те, при плохом раскладе Вы каждый объект с айпи три раза пингуете.
Такая логика?
Сколько у Вас таких объектов? Сколько времени тратится на один пинг?
Это надо делать с интервалом в минуту?
Может, стоит это запускать через таймауты, чтобы они отдельными потоками выполнялись?
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург

Re: Долгий запрос MySQL

Сообщение nick7zmail »

А вы вкурсе, что вы вообще все объекты вытягиваете из системы? Прямо вообще все? Не проще хотя бы по классу ещё отобрать? У вас наверное те которые надо пинговать хотя бы в 1 или в нескольких классах собраны? Или я ошибаюсь?
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
PAV
Сообщения: 970
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва

Re: Долгий запрос MySQL

Сообщение PAV »

В курсе, но там не так уж и много объектов с IP, штук 20. А можете подсказать, на примере кода выше, как ограничить класс?
Аватара пользователя
xor
Сообщения: 2044
Зарегистрирован: Сб ноя 22, 2014 8:45 pm

Re: Долгий запрос MySQL

Сообщение xor »

Посмотрите функцию getObjectsByProperty. Она отберёт Вам только объекты с заданным свойством и условием. Но, боюсь, это не спасёт. Отбор хоть селектом, хоть функцией занимает минимум времени по сравнению с тем, что творится в цикле
PAV
Сообщения: 970
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва

Re: Долгий запрос MySQL

Сообщение PAV »

А процесс пинга можно как-то ускорить?
slex_s
Сообщения: 4
Зарегистрирован: Пт ноя 06, 2015 3:35 pm

Re: Долгий запрос MySQL

Сообщение slex_s »

$host="192.168.0.1";
exec("ping -c 2 -i 0.2 -w 1 " . $host, $output, $result);

if ($result == 0){

echo "Ping successful!";
}
else{

echo "Ping unsuccessful!";
}
PAV
Сообщения: 970
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва

Re: Долгий запрос MySQL

Сообщение PAV »

:!: :geek: 9 секунд на все!!!! Спасибо ;)
Ответить