我正在尝试从PHP访问MySql中非常大的表,但执行时间非常大(有时超过10分钟),我尝试使用limit和offset尝试减少执行时间,但是没有帮助。我将限制设置为1,这样一旦找到行,它就会停止搜索更多行,并且我使用了Offset,以便下次搜索一行时,从最后一行开始搜索:
$offset1 = 0;
for ($date = mktime($hour_i,$minute_i,0,$month_i,$day_i,$year_i); $date <= mktime($hour_f,$minute_f,0,$month_f,$day_f,$year_f); $date = mktime($hour,$minute+$time_step,0,$month,$day,$year))
{
$hour = date('H',$date);
$minute = date('i',$date);
$second = date('S', $date);
$day = date('d',$date);
$month = date('m',$date);
$year = date('Y',$date);
?>
<?php
$Ensoleillement_Query = mysql_query("SELECT Moyenne, @row := @row + 1 AS ROW FROM mesure_ensoleillement,(SELECT @row := 0) r WHERE IdMesure IN(SELECT IdMesures FROM mesures WHERE IdPasserelle='".$PERSIL."' and ColonneEnregistrement='IdEnsoleillement')
and hour(DateMesure)= ".$hour."
and minute(DateMesure) = ".$minute."
and year(DateMesure)= ".$year."
and month(DateMesure)= ".$month."
and day(DateMesure)= ".$day." LIMIT 1 OFFSET ".$offset1." ");
if (!$Ensoleillement_Query) {
die('Query failure Query: ' . mysql_error());
}
if(mysql_num_rows($Ensoleillement_Query) == 0) die("There is no Data in the Database corresponding to that date or site");
$Ensoleillement[$i] = mysql_result($Ensoleillement_Query,0,0);
$offset1 = mysql_result($Ensoleillement_Query,0,1);
$offset1 = $offset1-1;
}
答案 0 :(得分:1)
LIMIT
会影响读取数据的效果。我们来举个例子:
有人给你一份报纸并说“阅读所有内容,然后告诉我第三页上的内容”。或者他可以说“只读第三页然后告诉我它”。最后一个是限制是如何工作的。你会尽快完成,因为你不是在试图阅读你最不需要的东西。
现在想象一下这个人就在你对面的房间里,他需要走到你面前递给你报纸。你会阅读多少报纸并不重要,走过去需要花费相同的时间。 LIMIT
对此没有影响。为了让人走得更快(完成类比),您可以添加索引或以其他方式优化查询。