2011-07-31 12 views
0

私は知っている2つの領域がプロセスの娼婦ですが、私はそれらをより良くする方法がわかりません。問題のこれらのクエリを最適化するにはどうすればよいですか?

2ヶ所はここ

http://i.imgur.com/Kb5Bv.png

示されており、対応するクエリ

エリア1

$nresult = mysql_query("SELECT time 
         FROM log 
         ORDER BY time 
         LIMIT 1") or die(mysql_error); 

$nr = mysql_fetch_assoc($nresult); 

$aresult = mysql_query("SELECT * 
         FROM log") or die(mysql_error); 

$an = mysql_num_rows($aresult); 

$aresult = mysql_query("SELECT AVG(players) 
         FROM log") or die(mysql_error); 

$ap = mysql_fetch_assoc($aresult); 

$average = round($an/((time()-$nr['time'])/60/60), 2); 

echo "<p class=\"tf2\"><span>{$an}</span> items since " . date("F j, Y", $nr['time']) . " at " . date("g:i a", $nr['time']) . ".<br /><span>" . $average . "</span> items received per hour (<span>" . round($average/$ap['AVG(players)'], 2) . "</span>/player/hour).<br />Showing <span>{$_SESSION['limit']}</span> items per page.</p>"; 

エリア2

if (!empty($_GET['s']) && !empty($_GET['t']) && !empty($_GET['m'])&& !empty($_GET['q'])) { 

    if ($_GET['m'] != 'all') { 

     $m = "AND method = {$_GET['m']}"; 
    } 
    else { 

     $m = ''; 
    } 

    if ($_GET['q'] != 'all') { 

     $q = "AND quality_id = {$_GET['q']}"; 
    } 
    else { 

     $q = ''; 
    } 

    if ($_GET['s'] == ' ') { 

     $s = '1=1'; 
    } 
    else { 

     $s = "{$_GET['t']} LIKE '%" . mysql_real_escape_string($_GET['s']) . "%'"; 
    } 

    $num_result = mysql_query("SELECT * 
           FROM log 
           LEFT JOIN item_definition 
           on log.item = item_definition.item_definition_desc 
           LEFT JOIN method 
           on log.method = method.method_id 
           LEFT JOIN item 
           on item_definition.item_definition_id = item.item_id 
           LEFT JOIN server 
           on log.server = server.ip 
           LEFT JOIN quality 
           on log.quality = quality.quality_id 
           WHERE {$s} 
           {$m} 
           {$q}") 
           or die(mysql_error()); 
} 
else { 

    $num_result = mysql_query("SELECT * 
           FROM log") or die (mysql_error()); 
} 

$total = mysql_num_rows($num_result); 

echo "<center>" . $total . " results</center><br />"; 

ライブページでは、あなたが見ることができるようにそれをロードするようにするために、それは時間の良い量をとり、ここでhttp://www.tf2items.711clan.net/

です。

ご了承ください。

+1

こんにちは[Bobbyテーブル](http://xkcd.com/327/)。あなたのコードは安全ではありません!あなたのアプリはSQLインジェクションを受けやすい。 mysql_real_escape_string()を使用してSQLクエリで使用されるすべてのパラメータをエスケープします。これを '$ m ="とANDメソッド= {$ _GET ['m']} ";'で滑らせてはいけません。 – Shef

+0

最初にテーブルの( 'log'、' item_definition'、...)定義を追加してください:フィールド、タイプ、制約、(主キー、外部キー)、インデックス、エンジン。 –

答えて

4

LIMIT/OFFSETコマンドが表示されません。あなたのショップでページングを使用している場合、これはあなたにブーストを与えます。 また、検索フィルタが変更されない場合はどこかにキャッシュすることもできます。

+0

しかし、テーブル内のすべての行を制限すると、その行をすべて数えることはできますか? –

+2

あなたは要素を数えるだけの分離クエリを行います。それは多くのデータを返す必要がない場合は速いです。 – duedl0r

+0

@ duedl0r: '' SELECT * FROM log "'クエリで既にカウントされていますか? –

0

2番目のクエリをSELECT COUNT(*) FROM logに置き換えます。これは、行数を取得して行データを無視しているためです。

関連する問題