2011-08-15 23 views
0

私はこれと同じように動作するクエリを持っていますが、クエリを少なくするために最適化したいと考えています。PHP/MySQLクエリの最適化?

次のコードは、掲示板システム用に作成しているユーザーメダルプラグインのコードです。

$types = array('numposts', 'numthreads', 'numreps'); 
$medals = ""; 

foreach($types as $type) 
{ 
    $query = $db->query(" 
     SELECT u.*, m.* 
     FROM ".TABLE_PREFIX."medals_".$type." m 
     LEFT JOIN ".TABLE_PREFIX."medals u ON (m.".$type."_id=u.awid) 
     WHERE awuid='".intval($post['uid'])."' AND type='".$type."' 
     ORDER BY `".$type."` DESC LIMIT 1 
    "); 

    while($results = $db->fetch_array($query)) 
    { 
     $medals .= "<img src=\"uploads/medals/".$results['icon']."\" border=\"0\" alt=\"".$results['descrition']."\" title=\"".$results['description']."\" /> "; 
    } 
} 

各投稿について、このクエリを実行してユーザーのメダルを表示します。投稿の数に応じて、クエリは3倍されます。たとえば、スレッドに10個の投稿がある場合... 10x3は30 ... 30個のクエリがこのコードで実行されています。

クエリを少なくするために最適化するにはどうすればよいですか?おそらくキャッシング?私は最適化があまり良くないので、ここであなたの入力を求めています。

+0

「投稿数」はより深刻な乗数であるため、そのコードも表示されるべきではありませんか? – webbiedave

答えて

1

投稿テーブルにリンクするので、投稿が実際に表示されているユーザーのみメダルを取得できます。このクエリを個別に実行すると、ユーザーあたり1つのメダルリストレコードしか得られず、配列やその他の変数に格納できます。

投稿の表示を開始すると、メダルリストに戻り、ユーザーのメダルを引き上げることができます。あなたの10の投稿に2人のチャットがあったとすると、2x3 = 6行のデータ(2人のユーザーx 3種類のメダル)を取得するクエリが1回発生し、実際にメダルを保存するメモリがあります投稿を取得/表示します。

+0

これは単なるプラグインです。投稿テーブルは、掲示板のコアコードを介して既にリンクされています。そして、投稿が表示されているユーザーのメダルだけを取得していますが、各投稿に対してこのクエリを実行しています。私はどういうわけか、スレッドの一部であるユーザーごとに一度このクエリを実行したいだけです。 – Spencer

+0

コードを上に移動してポストフェッチコードにアタッチできない場合は、静的なvarを使用してユーザーIDとそのメダルデータを格納します。ユーザーのIDが静的配列の内部にない場合にのみクエリを実行します。そうであれば、配列データを返します。それ以外の場合はデータをフェッチして配列に格納し、配列データを返します。 –

+0

もう少し解説していただけますか?おそらくサンプルコードを提供します。 – Spencer