2013-03-27 51 views
0

我試圖從PHP訪問MySql中的非常大的表,但執行時間非常大(有時超過10分鐘),我試過了使用極限和偏移量試圖減少執行時間,但他們沒有幫助。我設置限制爲1,這樣,一旦我找到了行,則停止搜索更多的行,我用偏移,使下一次它尋找一個排,開始從最後一排達成搜索:可以LIMIT和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; 

} 

回答

1

LIMIT影響讀數的性能。讓我們用一個例子:

有人給你一份報紙,並說「閱讀全部內容,然後告訴我第三頁的內容」。或者他可以說「只讀第三頁,並告訴我」。最後一個是限制如何工作。你會很快完成的,因爲你不想去讀你最終不需要的東西。

現在想象一下這個人與你隔着房間,他需要走過去向你遞交報紙。閱讀報紙的數量並不重要,漫步需要花費相同的時間。 LIMIT對此沒有影響。爲了讓人走得更快(完成比喻),您可以添加索引或以其他方式優化查詢。

+0

好的,謝謝, 但你知道我怎樣才能返回在MySQL的初始表中選擇的記錄行號? cz在MySql中沒有row_number()這樣的事 – Maggie 2013-03-28 13:34:27

+0

沒有行號這樣的事情。我不確定你想要用它做什麼,但是當你在PHP中閱讀時計算每一行是微不足道的。 – Halcyon 2013-03-28 14:45:59

+0

還有一個問題,當我說LIMIT 1 OFFSET 100 WHERE ...例如,這是否意味着查詢將轉到初始表,我從中選擇記錄,跳過100行並開始查找記錄,一旦它發現它,它停止看? – Maggie 2013-03-28 15:32:08