2016-10-12 18 views
0

私のウェブサイトでは、バスケットボール選手の統計情報を保存しています。現在、以下のコードを使用していますが、各プレイヤーに11個の属性統計があるため、各チームに132個のクエリが必要です。したがって、264個のクエリがチームに必要です。デバッグでは、私のサイトに多くの時間を費やす各クエリに対して、0.5秒必要であることがわかりました。クエリを高速化します。 WordpressのPhp Sql

  1. データベース内のレコードは実行時間に影響しますか?私は2mのレコードを持っていましたが、今は1.mのレコードを持っているので、違いはほとんど見られません。
  2. クエリを高速化するためにこのコードを書く方が良いですか?

    $出力。= ''; $出力。= ''; $出力。= ''; = '' .__( 'イベント追加'、 'leagueengine')。 ''; $出力。= ''; 。

    $output .= '</tr>'; 
    $output.="<tr><td></td></tr>"; 
    $output.="<tr><td colspan='2'>".__('Home Team','leagueengine')."</td>"; 
    
         $events = $wpdb->get_results("SELECT * FROM wp_leagueengine_data WHERE data_type = 'event' ORDER BY sort_order ASC, data_value ASC"); 
         //$events_count=0; 
         foreach($events as $event) { 
           $output.="<th><center><small>$event->data_value</small></center></th>"; 
           // $events_count++; 
         } 
          $output.="</tr>"; 
         $t_p=count ($homeplayers2); 
         if($t_p){ 
           foreach($homeplayers2 as $homeplayer){ 
    
            $output.="<tr>"; 
             $output.="<td colspan='2'>".leagueengine_fetch_data_from_id($homeplayer->player_id,'data_value')."</td>"; 
             foreach($events as $event){ 
              $evcount = $wpdb->get_results("SELECT count(*) as total_events FROM $table2 WHERE match_id='$mid' AND player_id='$homeplayer->player_id' AND event_id='$event->id'"); 
              $total= $evcount[0]->total_events; 
    
               $output.="<td><input type='text' name=hm-$homeplayer->player_id-$event->id value='$total'/></td>"; 
             } 
            $output.="</tr>"; 
           } 
         } 
         else{ $output.="<tr><td colspan='12'>No player attending this match</td></tr>";} 
    
    
    $output.="<tr><td></td></tr>"; 
    

    $出力= '';

+7

uはループでSQLを実行するべきではありません。 1つのSQLステートメントを使用して、結果を必要とするインデックスを呼び出すようにしてください。 – KikiTheOne

+1

テーブルのインデックスを作成しましたか? –

+0

いいえ、私はインデックスを付けません。私はプラグインを使って1日に約10回イベントテーブルを追加して更新します。大きな問題は、各プレイヤーの合計合計イベント数をカウントする場合です –

答えて

1

これは多くのクエリを必要とせず、実際には1つだけ必要です。

ループ内でクエリを実行することは、非常に非効率な処理を行っていることを明確に示しています。特にこれらのクエリがSELECTクエリの場合
この場合の適切なツールは、SELECTINNER JOINまたはLEFT JOINの1つを使用して、他のテーブルに関連付けられたデータを取得しています。ここで

は、あなたがこれを行うことができる方法の、迅速、かつ不完全な例です:

<?php 
$output .= '<form action="" method="POST" style="margin-bottom:20px;">'; 
$output .= '<table class="form">'; 
$output .= '<tr>'; 
$output .= '<th colspan="12">' . __ ('Add Event', 'leagueengine') . '</th>'; 
$output .= '<th colspan="2" style="text-align:center;"><input style="vertical-align:middle;" type="submit" name="add_home_event_to_match" class="button-primary" value="' . __ ('Submit', 'leagueengine') . '" /></th>'; 

$output .= '</tr>'; 
$output .= "<tr><td></td></tr>"; 
$output .= "<tr><td colspan='2'>" . __ ('Home Team', 'leagueengine') . "</td>"; 

// Query the database for all relevant details using JOINs. 
$query = <<<QueryString 
    SELECT ld.*, count(*) as total_events FROM wp_leagueengine_data AS ld 
    INNER JOIN results AS r ON r.match_id=ld.id AND player_id={$homeplayer->player_id} AND event_id={$event->id} 
    WHERE data_type = 'event' ORDER BY sort_order ASC, data_value ASC 
QueryString; 

$events = $wpdb->get_results ($query); 

// This is used to keep track of the events, so that we can print out the header when this changes. 
$oldEvent = 0; 

// $events_count=0; 
foreach ($events as $event) { 
    // Print the event header if we have a new event ID. 
    if ($oldEvent != $event->id) { 
     $output .= "</tr><tr><th><center><small>{$event->data_value}</small></center></th></tr><tr>"; 
     $oldEvent = $event->id; 
    } 

    // $events_count++; 

    $t_p = count ($homeplayers2); 

    if ($t_p) { 
      $output .= "<tr>"; 
      $output .= "<td colspan='2'>" . $event->player_id . "</td>"; 
      $total = $event->total_events; 
      $output .= "<td><input type='text' name='hm-{$event->player_id}-{$event->id}' value='$total'/></td>"; 
      $output .= "</tr>"; 
    } else { 
     $output .= "<tr><td colspan='12'>No player attending this match</td></tr>"; 
    } 
} 

$output .= "<tr><td></td></tr>"; 
$output .= '</form>'; 
+0

フリー・ランナーとして働いている人は誰ですか?私はキリスト教の解決策を前置きします。私はこれを行う必要がありますが、私はそれを達成することができるとは思わない。 –

+0

@GiwrgosRad:私はフリーライターとして働いていたが、私はあなたのためにこれを行う時間も能力もないと思う。私はあなたに最高の運が欲しいと願っています。私はあなたがあなたの限界を理解しているのを見てうれしいです。あなたが本当に偉大な開発者になるためには、この道をもっと踏み出すことを決めるべきでしょうか。 :) – ChristianF

関連する問題