2013-10-28 68 views
0

我有一個SQL查詢MySql表有百萬條記錄。這在大約2秒內在phpMyAdmin中執行,但是從PHP腳本運行時,它不會完成執行。MySql查詢執行需要從PHP永遠,但很快從phpMyAdmin運行完成

select 
    concat(p1.`Date`," ",p1.`Time`) as har_date_from, 
    concat(p2.`Date`," ",p2.`Time`) as har_date_to, 
(select concat(p3.`Date`," ",p3.`Time`) from 
    power_logger p3 
    where p3.slno between 1851219 and 2042099 
    and p3.meter_id="logger1" 
    and str_to_date(concat(p3.`Date`," ",p3.`Time`),"%d/%m/%Y %H:%i:%s") >= 
     str_to_date(concat(p1.`Date`," ",p1.`Time`),"%d/%m/%Y %H:%i:%s") 

    order by p3.slno limit 1) as cur_date_from, 
    (select concat(p4.`Date`," ",p4.`Time`) from 
     power_logger p4 
     where p4.slno between 1851219 
     and 2042099 
     and p4.meter_id="logger1" 
     and str_to_date(concat(p4.`Date`," ",p4.`Time`),"%d/%m/%Y %H:%i:%s") >= 
      str_to_date(concat(p2.`Date`," ",p2.`Time`),"%d/%m/%Y %H:%i:%s") 
     order by p4.slno 
     limit 1 
    ) 
     as cur_date_to, 
     p1.THD_A_N_Avg-p2.THD_A_N_Avg as thd_diff 
     from power_logger p1 
    join 
     power_logger p2 
     on p2.slno=p1.slno+1 
     and p1.meter_id="fluke1" 
     and p2.meter_id=p1.meter_id 
     and p1.slno between 2058609 and 2062310 
     and p1.THD_A_N_Avg-p2.THD_A_N_Avg>=2.0000 

php腳本: $query=/*The query above passed as string*/ $mysql=mysql_connect('localhost','username','pwd') or die(mysql_error()); mysql_select_db('dbname',$mysql); $rows=mysql_query($query,$mysql) or die(mysql_error());

有mysql中的連接和相關的東西沒有問題,因爲我成功地運行了很多其他的查詢。我在meter_id和Date,Time一起設置了索引。 slno是自動增量值。 我知道還有類似的問題,因爲我發現我的研究很多,但他們都沒有幫助我。如果有人能幫我找到解決方案,請提前致謝。

查詢描述:查詢包含數百萬條記錄和THD_A_N_AVG,meter_id,slno,日期和時間在內的power_logger表格。這將從兩個連續的行中選擇日期和時間,在slnos範圍內,THD_A_N_AVG之間的差值大於或等於2.當這些日期被提取時,它甚至必須在不同的slnos範圍內獲取日期和時間日期和時間最接近先前提取的時間,從而形成har_date_from,har_date_to,cur_date_from,cur_date_to。 這裏弄的是嵌套選擇。

+1

請使用您正在使用的php代碼更新您的問題..我們無法理解此查詢的任何內容...更新詳細信息 – Damodaran

+0

由於查詢在phpmyadmin中執行,因此問題可能不在查詢中。 ..你的php代碼是什麼? – Damodaran

+0

@達摩達蘭:謝謝你的快速回復。我已經更新了這個問題,包括php腳本,這是一個簡單的mysql連接和查詢功能。 – Rohith

回答

1

通常PHPMyAdmin會在查詢結束時自動添加「LIMIT 0,30」,因此您只能一次加載30行。在你的代碼中,你試圖一次加載所有東西,這就是爲什麼它需要這麼長時間。

+0

感謝您的回答。你是對的。當我在腳本中將行限制爲30時,它會很好地執行。你可以在查詢中提出任何解決方法,以使它在腳本和客戶端中更快。 – Rohith

相關問題