Php 如何优化这些查询?

Php 如何优化这些查询?,php,mysql,query-optimization,Php,Mysql,Query Optimization,我知道有两个领域是流程妓女,但我不知道如何改善它们 这里显示了两个有问题的地方 以及相应的查询 区域1 $nresult = mysql_query("SELECT time FROM log ORDER BY time LIMIT 1") or die(mysql_error); $nr = mysql_fetch_assoc($nresult); $

我知道有两个领域是流程妓女,但我不知道如何改善它们

这里显示了两个有问题的地方

以及相应的查询

区域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>";
$nresult=mysql\u查询(“选择时间
从日志
按时间订购
限制1”)或模具(mysql_错误);
$nr=mysql\u fetch\u assoc($nresult);
$aresult=mysql\u查询(“选择*
从日志)或死亡(mysql_错误);
$an=mysql\u num\u行($aresult);
$aresult=mysql\u查询(“选择平均值(玩家))
从日志)或死亡(mysql_错误);
$ap=mysql\u fetch\u assoc($aresult);
$average=round($an/((time()-$nr['time'])/60/60),2);
echo“

{$an}项自”。日期(“F j,Y”,$nr[‘时间’])。“在”。日期(“g:IA,$nr[‘时间’])。“
”$一般。“每小时收到的项目(“.round($average/$ap['AVG(players)”),2)。”/player/hour)。
显示每页{$\u会话['limit']}个项目。

”;
区域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 />";
if(!empty($_GET['s'])和&!empty($_GET['t'])和&!empty($_GET['m'])和&!empty($_GET['q'])){
如果($_GET['m']!='all'){
$m=“AND method={$\u GET['m']}”;
}
否则{
$m='';
}
如果($_GET['q']!='all'){
$q=“AND quality_id={$\u GET['q']}”;
}
否则{
$q='';
}
如果($_GET['s']=''){
$s='1=1';
}
否则{
$s=“{$\u GET['t']}类似“%”。mysql\u real\u escape\u字符串($\u GET['s'])。“%”;
}
$num\u result=mysql\u查询(“选择*
从日志
左联接项定义
on log.item=item\u definition.item\u definition\u desc
左连接法
on log.method=method.method\u id
左连接项
在item\u definition.item\u definition\u id=item.item\u id上
左加入服务器
在log.server=server.ip上
左连接质量
在log.quality=quality.quality\u id上
其中{$s}
{$m}
{$q}”)
或者死(mysql_error());
}
否则{
$num\u result=mysql\u查询(“选择*
从日志)或死亡(mysql_error());
}
$total=mysql\u num\u行($num\u result);
“回声”$全部的“结果
”;
现场页面在这里

正如您所看到的,它需要很长时间才能加载


欢迎提供任何提示。

我没有看到任何限制/偏移命令。。如果你在商店里使用分页功能,这可能会给你带来提升。
或者您也可以尝试将其缓存到某个位置(如果搜索筛选器没有更改)

我看不到任何限制/偏移命令。。如果你在商店里使用分页功能,这可能会给你带来提升。
或者您也可以尝试将其缓存到某个位置(如果搜索筛选器没有更改)

将第二个查询替换为日志中的
选择计数(*),因为您正在获取行计数并忽略行数据。

将第二个查询替换为日志中的
选择计数(*),因为您正在获取行计数并忽略行数据。

您好。你的代码不安全!您的应用程序易于SQL注入。使用
mysql\u real\u Escape\u string()
转义SQL查询中使用的所有参数,就像在某些地方所做的那样。不要让这个
$m=“AND method={$\u GET['m']}”跳过。首先,请添加表“(
log
item\u definition
,…)定义:字段、类型、约束、(主键、外键)、索引、引擎。您好。你的代码不安全!您的应用程序易于SQL注入。使用
mysql\u real\u Escape\u string()
转义SQL查询中使用的所有参数,就像在某些地方所做的那样。不要让这个
$m=“AND method={$\u GET['m']}”跳过。首先,请添加表(
log
item\u definition
,…)定义:字段、类型、约束、(主键、外键)、索引、引擎。但是,如果我限制表中的所有行,如何计算它们?您可以执行一个只计算元素的单独查询。如果它不必返回大量数据,速度会快得多。@duedl0r:您已经使用
“SELECT*FROM log”
查询进行了计数,不是吗?但是如果我限制了表中的所有行,如何计算它们呢?您可以执行只计算元素的独立查询。如果它不必返回大量数据,速度会快得多。@duedl0r:您已经用
从日志中选择*查询了,是吗?