2012-11-23 31 views
0

存在性能問題,我堅持使用基於PHP & MySql的應用程序。該應用程序用於數據遷移,其中必須上載數據並且在各種過程(從外來字符清除,重複檢查,ID生成)之後,必須將其插入到一箇中央表格中,然後插入到5個不同的表格中。在那裏,生成一個id並且該id必須更新到中央表。 有不同的記錄和驗證規則集。我面臨的問題是,當我插入說(4K)行文件(包含20列),它在15分鐘內工作正常,它插入到處。但是,當我再次插入相同的記錄時,此時需要一個小時才能插入(理想情況下,它應通過將較早插入的數據標記爲重複項來插入)。 通過日誌文件後,我注意到有一個Mysql select語句,我正在檢查重複項並獲取重複項的ID。然後我在裏面調用一個函數for循環,它基本上是將記錄插入5個表格並將id更新到中央表格。這個呼叫功能是整個過程的主要時間。附:這些記錄必須插入創紀錄的紀錄..請推薦一些解決方案..重型Mysql操作和時間限制

//這是示例代碼

$query=mysql_query("SELECT DISTINCT p1.ID 


FROM table1 p1, table2 p2, table3 a 
WHERE p2.datatype =0 
AND (p1.datatype =1 || p1.datatype=2) 
AND p2.ID =0 
AND p1.ID = a.ID 
AND p1.coulmn1 = p2.column1 
AND p1.coulmn2 = p2.coulmn2 
AND a.coulmn3 = p2.column3"); 
$num=mysql_num_rows($query); 
for($i=0;$i<$num;$i++)  { 
$f=mysql_result($query,$i,"ID"); 
//calling function 
RecordInsert($f); 
} 
+1

你是否誠實地認爲任何人都可以在沒有看到任何代碼的情況下理解你的問題? –

+4

請添加一些示例代碼 –

回答

0

沒有你的代碼,我只能給你解決的一般準則。基本上,在開始插入之前獲取所有現有的值。在插入時,請檢查此緩存列表以查看是否存在重複,而不是執行查詢。插入後,將插入的項目添加到緩存項目列表中,以防萬一再次出現。如果您的表格可能會添加到您的腳本之外,而腳本正在運行,那麼只需鎖定您正在使用的表格,直到完成爲止。