Нужна помощь

Furilen

Интересующийся
📜
Сообщения
113
Реакции
17
Долго думал куда вопрос написать, решил что тут будет самое место.
Собственно нужна помощь опытных. Есть код.
PHP:
//Проверяем одетые вещи и вещи с сроком годности
            $cl = mysql_query('SELECT
            `iu`.`time_sleep`,`im`.`id`,`im`.`name`,`im`.`img`,`im`.`type`,`im`.`inslot`,`im`.`2h`,`im`.`2too`,`im`.`iznosMAXi`,`im`.`inRazdel`,`im`.`price1`,`im`.`price2`,`im`.`price5`,`im`.`pricerep`,`im`.`magic_chance`,`im`.`info`,`im`.`massa`,`im`.`level`,`im`.`magic_inci`,`im`.`overTypei`,`im`.`group`,`im`.`group_max`,`im`.`geni`,`im`.`ts`,`im`.`srok`,`im`.`class`,`im`.`class_point`,`im`.`anti_class`,`im`.`anti_class_point`,`im`.`max_text`,`im`.`useInBattle`,`im`.`lbtl`,`im`.`lvl_itm`,`im`.`lvl_exp`,`im`.`lvl_aexp`,
            `iu`.`id`,`iu`.`item_id`,`iu`.`1price`,`iu`.`2price`,`iu`.`uid`,`iu`.`use_text`,`iu`.`data`,`iu`.`inOdet`,`iu`.`inShop`,`iu`.`delete`,`iu`.`iznosNOW`,`iu`.`iznosMAX`,`iu`.`gift`,`iu`.`gtxt1`,`iu`.`gtxt2`,`iu`.`kolvo`,`iu`.`geniration`,`iu`.`magic_inc`,`iu`.`maidin`,`iu`.`lastUPD`,`iu`.`timeOver`,`iu`.`overType`,`iu`.`secret_id`,`iu`.`time_create`,`iu`.`time_sleep`,`iu`.`inGroup`,`iu`.`dn_delete`,`iu`.`inTransfer`,`iu`.`post_delivery`,`iu`.`lbtl_`,`iu`.`bexp`,`iu`.`so`,`iu`.`blvl`
            FROM `items_users` AS `iu` LEFT JOIN `items_main` AS `im` ON (`im`.`id` = `iu`.`item_id`) WHERE (`iu`.`inOdet`!="0" OR `iu`.`data` LIKE "%srok%" OR `iu`.`data` LIKE "%vip_sale%" OR `iu`.`iznosNOW` >= `iu`.`iznosMAX` OR `im`.`srok` > 0 OR `iu`.`data` LIKE "%sudba=1%" OR (`iu`.`timeOver`<'.OK.' AND `iu`.`timeOver`!="0")) AND `iu`.`uid`="'.$u['id'].'" AND `iu`.`delete`="0"');
            while($itm = mysql_fetch_assoc($cl)) {
                $po = array();
                $po = $this->lookStats($itm['data']);
                $po['lvl'] = $u['level'];
                //проверяем требования               
                $t = $this->items['tr'];
                $x = 0;
                $notr = 0;
                $j = 1;
                while($j<=4){
                    if(!isset($po['tr_s'.$j]) && $itm['type']!=26){
                        $po['tr_s'.$j] = 0;
                    }
                    $j++;
                }
                while($x < count($t)) {
                  $n = $t[$x];
                  if( isset($po['tr_'.$n]) && $n == 'sex' ) {
                      if( $po['tr_'.$n] != $this->info['sex'] ) {
                         $notr++;
                      }
                  }elseif(isset($po['tr_'.$n])) {
                    if($po['tr_'.$n] > $this->stats[$n] && $n != 'align' && $n != 'align_bs') {
                      $notr++;
                    }
                  }
                  $x++;
                }
                if( $itm['type'] == 31 ) {
                    $notr++;
                }
                if(isset($po['srok']) && $po['srok'] > 0){
                    $itm['srok'] = $po['srok'];
                }
                /*if(isset($po['vip_sale'])) {
                    if($sn['silver'] < 2 && ($itm['time_create']-OK) < 0) {
                        $this->isport($itm['id'],$itm['timeOver'],$itm['overType'],$u['id'],(int)$po['musor2'],$itm['type'],$itm['name']);
                        $notr++;
                    }
                }*/
                if($itm['iznosNOW']>=ceil($itm['iznosMAX']) && $itm['iznosMAXi'] != 999999999){
                    $notr++;   
                }
                if($notr > 0 && $itm['inOdet'] != 0 && ($itm['inOdet'] < 59 || $itm['inOdet'] > 62) ) {
                    //снимаем предмет
                    $this->snatItem($itm['id'],$u['id']);
                    $snIt++;
                }
                
                if( $po['sudba'] == '1' && $po['sudba'] != $this->info['login'] ) {
                    $po['sudba'] = $this->info['login'];
                    $itm['data'] = str_replace('sudba=1','sudba='.$this->info['login'] , $itm['data']);
                    mysql_query('UPDATE `items_users` SET `data` = "'.$itm['data'].'" WHERE `id` = "'.$itm['id'].'" LIMIT 1');
                }
                
                //проверяем срок годности
                //echo '['.$itm['item_id'].']';
                if(isset($_GET['inv'])) {
                    if($itm['iznosNOW']>=ceil($itm['iznosMAX']) && $itm['iznosMAXi'] != 999999999){
                        //предмет сломался
                        if(isset($po['musor'])){
                            if($po['musor']>0){
                                $this->recr($itm['id'],$itm['type'],$u['id'],(int)$po['musor']);
                            }
                        }
                    }elseif($itm['time_create']+$itm['srok'] <= OK && $itm['srok']>0 && $itm['time_sleep'] == 0){
                        if($itm['inOdet']!=0){
                            $this->snatItem($itm['id'],$u['id']);
                            $snIt++;
                        }
                        
                        if(isset($po['upatack_id'])) {
                            $this->addItem($po['upatack_id'],$itm['uid'],'|sudba=1');
                        }
                        if(isset($po['spell_id'])) {
                            $this->addItem($po['spell_id'],$itm['uid'],'|sudba=1');
                        }
                        if(isset($po['rune_id'])) {
                            $this->addItem($po['rune_id'],$itm['uid'],'|sudba=1');
                        }
                        
                        //удаляем предмет
                        $this->isport($itm['id'],$itm['timeOver'],$itm['overType'],$u['id'],(int)$po['musor2'],$itm['type'],$itm['name']);
                    }
                }
                
            }
Проблема в том что вот этот запрос выполняется почти 5 сек, с тем учетом что база еще не особо большая.
PHP:
$cl = mysql_query('SELECT
            `iu`.`time_sleep`,`im`.`id`,`im`.`name`,`im`.`img`,`im`.`type`,`im`.`inslot`,`im`.`2h`,`im`.`2too`,`im`.`iznosMAXi`,`im`.`inRazdel`,`im`.`price1`,`im`.`price2`,`im`.`price5`,`im`.`pricerep`,`im`.`magic_chance`,`im`.`info`,`im`.`massa`,`im`.`level`,`im`.`magic_inci`,`im`.`overTypei`,`im`.`group`,`im`.`group_max`,`im`.`geni`,`im`.`ts`,`im`.`srok`,`im`.`class`,`im`.`class_point`,`im`.`anti_class`,`im`.`anti_class_point`,`im`.`max_text`,`im`.`useInBattle`,`im`.`lbtl`,`im`.`lvl_itm`,`im`.`lvl_exp`,`im`.`lvl_aexp`,
            `iu`.`id`,`iu`.`item_id`,`iu`.`1price`,`iu`.`2price`,`iu`.`uid`,`iu`.`use_text`,`iu`.`data`,`iu`.`inOdet`,`iu`.`inShop`,`iu`.`delete`,`iu`.`iznosNOW`,`iu`.`iznosMAX`,`iu`.`gift`,`iu`.`gtxt1`,`iu`.`gtxt2`,`iu`.`kolvo`,`iu`.`geniration`,`iu`.`magic_inc`,`iu`.`maidin`,`iu`.`lastUPD`,`iu`.`timeOver`,`iu`.`overType`,`iu`.`secret_id`,`iu`.`time_create`,`iu`.`time_sleep`,`iu`.`inGroup`,`iu`.`dn_delete`,`iu`.`inTransfer`,`iu`.`post_delivery`,`iu`.`lbtl_`,`iu`.`bexp`,`iu`.`so`,`iu`.`blvl`
            FROM `items_users` AS `iu` LEFT JOIN `items_main` AS `im` ON (`im`.`id` = `iu`.`item_id`) WHERE (`iu`.`inOdet`!="0" OR `iu`.`data` LIKE "%srok%" OR `iu`.`data` LIKE "%vip_sale%" OR `iu`.`iznosNOW` >= `iu`.`iznosMAX` OR `im`.`srok` > 0 OR `iu`.`data` LIKE "%sudba=1%" OR (`iu`.`timeOver`<'.OK.' AND `iu`.`timeOver`!="0")) AND `iu`.`uid`="'.$u['id'].'" AND `iu`.`delete`="0"');
Моих скудных знаний не хватает что бы это как то упростить (ускорить). Буду очень благодарен если кто то поможет :)
 

Insallah

Специалист
👑
⚖️
🏆
📜
Сообщения
1,381
Реакции
436
Разверну запрос, а то прямо нечитаемый пиздец.
SQL:
SELECT
    `iu`.`time_sleep`,
    `im`.`id`,
    `im`.`name`,
    `im`.`img`,
    `im`.`type`,
    `im`.`inslot`,
    `im`.`2h`,
    `im`.`2too`,
    `im`.`iznosMAXi`,
    `im`.`inRazdel`,
    `im`.`price1`,
    `im`.`price2`,
    `im`.`price5`,
    `im`.`pricerep`,
    `im`.`magic_chance`,
    `im`.`info`,
    `im`.`massa`,
    `im`.`level`,
    `im`.`magic_inci`,
    `im`.`overTypei`,
    `im`.`group`,
    `im`.`group_max`,
    `im`.`geni`,
    `im`.`ts`,
    `im`.`srok`,
    `im`.`class`,
    `im`.`class_point`,
    `im`.`anti_class`,
    `im`.`anti_class_point`,
    `im`.`max_text`,
    `im`.`useInBattle`,
    `im`.`lbtl`,
    `im`.`lvl_itm`,
    `im`.`lvl_exp`,
    `im`.`lvl_aexp`,
    `iu`.`id`,
    `iu`.`item_id`,
    `iu`.`1price`,
    `iu`.`2price`,
    `iu`.`uid`,
    `iu`.`use_text`,
    `iu`.`data`,
    `iu`.`inOdet`,
    `iu`.`inShop`,
    `iu`.`delete`,
    `iu`.`iznosNOW`,
    `iu`.`iznosMAX`,
    `iu`.`gift`,
    `iu`.`gtxt1`,
    `iu`.`gtxt2`,
    `iu`.`kolvo`,
    `iu`.`geniration`,
    `iu`.`magic_inc`,
    `iu`.`maidin`,
    `iu`.`lastUPD`,
    `iu`.`timeOver`,
    `iu`.`overType`,
    `iu`.`secret_id`,
    `iu`.`time_create`,
    `iu`.`time_sleep`,
    `iu`.`inGroup`,
    `iu`.`dn_delete`,
    `iu`.`inTransfer`,
    `iu`.`post_delivery`,
    `iu`.`lbtl_`,
    `iu`.`bexp`,
    `iu`.`so`,
    `iu`.`blvl`
FROM
    `items_users` AS `iu`
    LEFT JOIN `items_main` AS `im` ON (`im`.`id` = `iu`.`item_id`)
WHERE
    (
        `iu`.`inOdet`!="0" OR
        `iu`.`data` LIKE "%srok%" OR
        `iu`.`data` LIKE "%vip_sale%" OR
        `iu`.`iznosNOW` >= `iu`.`iznosMAX` OR
        `im`.`srok` > 0 OR
        `iu`.`data` LIKE "%sudba=1%" OR
        (
            `iu`.`timeOver`<'.OK.' AND
            `iu`.`timeOver`!="0"
        )
    ) AND
    `iu`.`uid`="'.$u['id'].'" AND
    `iu`.`delete`="0"'
С одной стороны, запрос не особо гипер-тяжёлый. С другой, если хочешь тренироваться на кошках и тюнить по мелочам, посмотри сколько ячеек таблицы ты вызываешь, и какие из них реально используются в твоём while.
Вот это условия я не понял: `iu`.`timeOver`<'.OK.'. По нему получается, что ты ищешь значение меньше чем строка. Либо это константа, которую ты забыл указать в коде.
 

Insallah

Специалист
👑
⚖️
🏆
📜
Сообщения
1,381
Реакции
436
Было бы нешишним тебе написать что по твоему мнению делает код и что он должен делать. Хорошо поставленная задача — половина ответа.
 

oxy

Продвинутый
🏆
📜
Сообщения
386
Реакции
80
Почитай о EXPLAIN select... Там тебе покажет ключи без индексов и т.д. и сможешь легко найти горлышко бутылки
 

oxy

Продвинутый
🏆
📜
Сообщения
386
Реакции
80
Еще я бы посоветовал тебе заменить srok, sudba и прочее на json и вызывать что то в стиле iu.data.srok = 1. Это позволит индексировать данные и поиск ускорится в разы
 

k880TR

Некто
Сообщения
68
Реакции
5
В данном запросе об индексах вряд-ли нужно вспоминать, так как LIKE '%string%' не используется индексация . А тут в запросе таких лайков несколько, можно представить сколько нужно памяти на это все выделить. Тут нужно переписывать весь запрос. Этот кусок во многих сборках встречается кстати и не один раз. Оптимизируйте и будет счастье.
 
Сверху