2011-07-31 50 views
0

我有两个领域,我知道过程妓女,但我不知道如何改善他们。如何优化这些查询?

有问题的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 tables](http://xkcd.com/327/)。你的代码不安全!你的应用程序很容易进行SQL注入。用'mysql_real_escape_string()'退出SQL查询中使用的所有参数,就像你在某些地方做的一样。不要让这个'$ m =“和方法= {$ _GET ['m']}”;'滑过。 – Shef

+0

首先,请添加表('log','item_definition',...)定义:字段,类型,约束,(主键,外键),索引,引擎。 –

回答

4

我没有看到任何LIMIT/OFFSET命令..也许这会给你一个提升,如果你在你的店铺使用分页。 或者您也可以尝试将其缓存在某处(如果搜索过滤器不更改)。

+0

但如何限制它们,我怎样才能计算表中的所有行? –

+2

你做一个分离查询,只计算元素。如果不需要返回大量数据,速度会更快。 – duedl0r

+0

@ duedl0r:你已经用''SELECT * FROM log''查询计数了,不是吗? –

0

将第二个查询替换为SELECT COUNT(*) FROM log,因为您正在获取行计数并忽略行数据。