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

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

Модератор: immortal

Ответить
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

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

Сообщение PAV » Чт окт 19, 2017 12:49 am

Вот такой запрос занимает 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
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

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

Сообщение xor » Чт окт 19, 2017 1:35 am

Ну, дело, всё-таки, не в 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
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Чт окт 19, 2017 6:09 am

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

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

Сообщение PAV » Чт окт 19, 2017 1:08 pm

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

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

Сообщение xor » Чт окт 19, 2017 6:59 pm

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

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

Сообщение PAV » Ср окт 25, 2017 11:46 am

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

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

Сообщение slex_s » Ср окт 25, 2017 1:38 pm

$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!";
}
За это сообщение автора slex_s поблагодарил:
PAV (Ср окт 25, 2017 4:48 pm)
Рейтинг: 1.16%
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

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

Сообщение PAV » Ср окт 25, 2017 4:49 pm

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