0

PHP から MySql の非常に大きなテーブルにアクセスしようとしていますが、実行時間が非常に長く (10 分以上かかる場合もあります)、制限とオフセットを使用して実行時間を短縮しようとしましたが、そうではありませんでしたヘルプ。limit を 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;

}
4

1 に答える 1

1

LIMITデータ読み取りのパフォーマンスに影響します。例を使用しましょう:

誰かがあなたに新聞を渡し、「それを全部読んでから、3 ページに何があるか教えて」と言います。または、「3 ページだけ読んで、それについて教えてください」と言うことができます。最後の 1 つは、制限がどのように機能するかです。必要のないものを読もうとしないので、すぐに終わります。

今、その人があなたの部屋の向かいにいて、あなたに新聞を渡すためにあなたのところに行く必要があると想像してください. 新聞をどれだけ読むかは問題ではありません。通り過ぎるのにかかる時間は同じです。LIMITこれには影響しません。人がより速く歩くようにする (類推を完成させる) には、インデックスを追加するか、他の方法でクエリを最適化します。

于 2013-03-27T16:42:23.447 に答える