2014-01-29 100 views
0

實際上使用此臨時表概念becoz我希望查詢運行速度很快。 我的代碼如下複製到臨時表需要很長時間

$maketemp1 = " 
    CREATE TEMPORARY TABLE bin1 (
    `ackNo` varchar(55), 
     `repairStatus` varchar(100), 
     `productFamily` varchar(100), 
     `location` varchar(100), 

     `binTo` varchar(100), 
     `binTime` datetime, 
     `age` int(50) 

     ) 
    "; 

mysql_query($maketemp1) or die ("Sql error : ".mysql_error()); 

    $inserttemp1 = " 
    INSERT INTO bin1 
     (`ackNo`, `repairStatus`, `productFamily`, `location`,`binTo`,`binTime`,`age`) 
    SELECT customerupdate.ackNo,tblRepairQueue.repairStatus, tblRepairQueue.productFamily,tblRepairQueue.location,customerupdate.binTo,customerupdate.binTime, 
    TIMESTAMPDIFF(HOUR , customerupdate.binTime , '".$value."') FROM `tblRepairQueue` , `customerupdate` WHERE 
tblRepairQueue.ackNo=customerupdate.ackNo and tblRepairQueue.location='".$empLocationName."' 

    "; 

    mysql_query($inserttemp1) or die ("Sql error : ".mysql_error()); 

但是當我運行它花費的時間太長的時間來複制..the過程中,上面的查詢速度很慢時相比,正在發生的事情是正常的查詢.. ,也是我有另一個疑問。使用臨時表的概念會給結果更快嗎?

+0

什麼'EXPLAIN SELECT ...'返回? – Arjan

回答

0

臨時表可能不是最好的選擇,具體取決於您想要實現的目的......創建一個包含一些數據合併的表以縮小下幾個請求的範圍可能會很有用,但它很少有效這樣做。

此外,臨時表不能被訪問多次,所以需要一個真正的表。

創建表需要磁盤寫入,這比RAM中的純粹選擇要少得多。使用緩存方法,您可以非常快速地檢索前一個選擇的結果。您可以使用該選擇作爲查詢的FROM部分,使其比在龐大的數據庫中彙集更快。但即使如此......

我們正在發展大約1到數據集,根據用戶的權利(類別,商店,...)我們試圖爲每個用戶創建一個表指向他有權使用的產品,然後使用該表檢索數據,而不需要大量的條件,但使用SSD時仍然很慢。所以我們只是在服務器上丟棄了大量的RAM,我們用來填充臨時表的SELECT會在登錄時爲每個用戶運行,然後用作FROM並且一切都很完美。

+0

緩存獲取數據的速度很快,但更新的結果將無法實現..有沒有解決方案這個 – namratha

+0

MySQL緩存引擎足夠強大......更新後的數據將毫無問題地提供。確保你有正確的索引,一切都應該沒問題。如果不是的話,你可以通過陳述你正在玩的數據集來完成你的問題。 – Salketer

+0

$ cachefile ='cache /'。basename($ _ SERVER [「SCRIPT_FILENAME」]); (file_exists($ cachefile)){ \t include($ cachefile);如果(file_exists($ cachefile)){ \t include($ cachefile); \t退出; } else { ob_start(); -------- $ FP =的fopen($求CacheFile, 'W'); fwrite($ fp,ob_get_contents()); fclose(); ob_end_flush(); } – namratha