我如何优化这些查询?

时间:2011-07-31 19:36:08

标签: php mysql query-optimization

我知道有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/

如您所见,它需要花费大量时间才能加载。

任何提示都表示赞赏。

2 个答案:

答案 0 :(得分:4)

我没有看到任何LIMIT / OFFSET命令..如果您在商店中使用分页,这可能会给您带来提升。 或者您也可以尝试在某处缓存它(如果搜索过滤器没有更改)..

答案 1 :(得分:0)

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