2013-12-11 80 views
0

我有一個txt文件,看起來像這樣:大MySQL的INSERT語句

id,lat,lon,sequence,dist 
    98372,40.535257,-111.871612,1,0.0 
    98372,40.536023,-111.872235,2,0.1001 
    98372,40.535629,-111.872599,3,0.1335 
    98372,40.535499,-111.872559,4,0.1758 
    ...etc 

此文件可以是863650線長! (34MB)
我需要使用MyISAM引擎將每行作爲一行插入到MySQL數據庫中。 (我假設這將是最快的)

我在GoDaddy的服務器上託管,所以我沒有太多的控制Apache和MySQL配置。

這是我目前該會的工作,除了需要大約6+分鐘,服務器超時2所以它永遠不會完成後:

$raw = file_get_contents('file.txt'); 
    $lines = explode("\r\n", $raw); 
    $tablename = 'tablename'; 
    $tableHeaders = 'id,lat,lon,sequence,dist'; 
    foreach($lines as $line) { 
     $line_values = explode(",", $line); 
     $sqlValues = "VALUES("; 
     foreach($line_values as $value) { 
      $sqlValues .= "'$value',"; 
     } 
     $sqlValues = substr($sqlValues, 0, -1) . ")"; 
     $sqlSyntax = "INSERT INTO $tablename ($tableHeaders) $sqlValues"; 
     $mysqlcon->query($sqlSyntax); 
    } 


這能優化好?或者是有可能建立一個巨大的INSERT語句,如:

"INSERT INTO table (id,lat,lon,sequence,dist) 
    VALUES (98372,40.535257,-111.871612,1,0.0), 
    (98372,40.536023,-111.872235,2,0.1001), 
    (98372,40.535629,-111.872599,3,0.1335), 
    (98372,40.535499,-111.872559,4,0.1758), 
    ...etc (863647 more lines)" 



任何幫助將不勝感激!

+0

爲什麼不在INSERT循環中使用INSERT查詢? – Chandresh

+0

@Chandresh,你是什麼意思?這就是我在我的問題中發佈的第一個foreach示例中所做的事情嗎? – ksb86

回答

1

構建的巨型INSERT,像

"INSERT INTO table (id,lat,lon,sequence,dist) 
VALUES (98372,40.535257,-111.871612,1,0.0), 
(98372,40.536023,-111.872235,2,0.1001), 
(98372,40.535629,-111.872599,3,0.1335), 
(98372,40.535499,-111.872559,4,0.1758), 
...etc (863647 more lines)" 

這將是快許多倍。當我遇到類似問題時,使用單個巨大查詢的速度往往比單個查詢快1000倍。

注意:由於內存限制,您可能希望每1,000或5,000行「插入」插入; 863,650行可能會超過共享服務器上的最大可用內存。

編輯如果可以,請做LOAD DATA。由於安全原因,這可能無法在GoDaddy共享託管計劃中使用,但您可以嘗試。你會想要這樣的事情:

LOAD DATA INFILE '/path/to/file.txt' /* change to fit your path */ 
INTO TABLE `table` /* Is "table" really your table's name? If so, you should pick something more descriptive... */ 
FIELDS TERMINATED BY ',' /* because your data is separated by commas */ 
/* See my note below about LINES TERMINATED BY */ 
IGNORE 1 LINES /* skip the headers */ 
(id,lat,lon,sequence,dist) /* the column names */ 

您可能需要一個LINES TERMINATED BY條款。 From the manual

如果你已經產生了Windows系統上的文本文件,你可能需要使用TERMINATED由線「\ r \ n」正確讀取該文件,因爲Windows程序通常使用兩個字符的行終止。某些程序(如寫字板)在編寫文件時可能使用\ r作爲行終止符。要閱讀這些文件,請使用LINES TERMINATED BY'\ r'。

+0

爲什麼不加載http://dev.mysql.com/doc/refman/5.0/en/loading-tables.html – zinking

+0

@zinking:查看我上面的編輯。該頁面不提供加載數據的一種方法;它總結了兩個。在共享主機上,'LOAD DATA'可能不是一個選項。此外,您鏈接的頁面非常過時,順便說一下 - 現在5.0歲已經8歲了。 –

+0

是的,編輯好的版本對我來說看起來很完整。 – zinking