2017-05-15 18 views
0

:私は最初の文を削除すると最適化SQLクエリPHPのPhalcon

  if(($banners = $this->app->cache5min->get($key_cache)) === NULL) { 
      $find_items = array(); 
      $banners = $this->app->db->fetchAll(" 
SELECT b.id,b.active, b.richmedia, b.rich_position, b.ip_limit, 
     b.cookie_limit, b.cookie_interval, b.day_limit, b.limit_interval, 
     b.frequency, b.close_btn, b.use_geo, 
     bpl.s_x, bpl.s_y 
    FROM bs_items_places AS bp 
    LEFT JOIN bs_items AS b ON b.id = bp.item_id 
    LEFT JOIN bs_places AS bpl ON bpl.id = bp.place_id 
    WHERE b.active = 1 
     AND b.date_start < '".$dateNow."' 
     AND b.date_stop > '".$dateNow."' 
     AND bpl.active = 1 
     AND bp.place_id = {$idpl} 
     AND (IF((time_from!='00:00:00' AND time_to!='00:00:00'), 
       (time_from<='".$dateTimeNow."' 
      AND time_to >='".$dateTimeNow."'), 1) 
      ) 
    GROUP BY b.id 
    ORDER BY b.frequency DESC, b.day_limit DESC 
               "); 
      foreach($banners AS $bnr) { 
       $find_items[$bnr['id']] = $bnr; 
      } 
      $banners = $find_items; 
      $this->app->cache5min->save($key_cache,$banners); 
     } 

    //echo '<pre>'; print_r($banners); exit; 
    if(!$banners || !count($banners)) { return $this->getDefaultBanner($idpl,$x); } 

、私は最初の文を返すとき、私のCPUが100%、私のCPU良好であり、これはMySQLのproccessを与え、どのように私ができます選択クエリを最適化しますか?

+0

まず、あなたはそれを人間が読みやすくする必要があります。しかし、私はすでにあなたが用意したステートメントを使用していないことを伝えることができます。つまり、潜在的なSQLインジェクションの脆弱性が存在することを意味します。 –

+0

私はCPU負荷を修正する必要があります – GodmanT

+0

各カラムがどのテーブルにあるかを知らずに、特に 'time_from'と' time_to'です。 –

答えて

0

最初の手順は、必要がない限りLEFTを取り除くことです。これにより、より多くの最適化オプションが開かれることがあります。

この構築物は、本質的に非最適化可能である: "爆発-破" の問題が

WHERE start < ... 
    AND end > ... 

があります。まず、JOINsのために行の数が爆発し、doをGROUP BYに暗黙に入れます。しかし...一方、COUNT()SUM()のような「集合体」はありません。だからこれは貧弱な形式のクエリのような臭いです - なぜあなたはGROUP BYをする必要がありますか?重複している行がある場合、重複しない列ではどうなりますか?ランダムな値が得られます。 GROUP BYなしで何が起こるかを見てください。

bpにこの複合インデックスが助けるかもしれない:

INDEX(place_id, item_id) 
+0

私は最適化されたクエリを用意できますか? – GodmanT

+0

@ GodmanT - 私は試してみるべきことをいくつか教えてくれました。私はいくつかの質問をしました。 –