2011-06-03 47 views
5

我有一個超過134675+個值的數組,我需要將它們插入mySQL表。我知道所有需要使用PHP和mySQL數據插入的東西。有沒有一種快速方法可以讓我在30-60秒內將所有這些值插入遠程服務器?因爲當我用foreach方法嘗試時,頁面超時。遠程服務器不允許數據庫連接持續60秒以上。我不知道爲什麼。所以請用快速的邏輯來幫助我。在遠程數據庫中插入134675值的最快方法

下面是一些代碼,我嘗試:

foreach($array as $value) 
{ 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql); 
    //then some extra code. 
} 

注意 我沒有在服務器上這麼多的訪問權限。我的數據庫帳戶只能插入值,沒有其他值。它對mySQL DB有一個約束。我無法使用CSV或任何其他的東西。

+0

你可能無法發送那麼多的INSERT陳述如此之快。您是否考慮過將數據庫服務器配置爲不要如此快速關閉連接,或者在關閉時重新打開連接? – geoffspear 2011-06-03 18:46:45

+0

它不在我的手中來配置服務器。因爲我沒有特權。那麼替代溶液是什麼? – 2011-06-03 18:47:55

+0

使用準備好的語句也可能是一個好主意,而不僅僅是因爲它會避免SQL注入。 – geoffspear 2011-06-03 18:48:16

回答

15

你可以在你的循環中包含mysql_ping()函數。該功能會檢查連接是否打開,如果不是,則重新連接。使用

自己的例子,你可以這樣做:

foreach($array as $value) { 
    mysql_ping($dbconn); 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql); 
    //then some extra code. 
} 

編輯:應該指出的是,根據文檔中,MySQL 5.0.14之後,PHP不會自動重新連接。如果你使用更新版本的MySQL,你將不得不放入自己的連接邏輯,也許這樣(我還沒有測試過):

function check_dbconn($connection) { 
    if (!mysql_ping($connection)) { 
     mysql_close($connection); 
     $connection = mysql_connect('server', 'username', 'password'); 
     mysql_select_db('db',$connection); 
    } 
    return $connection; 
} 

foreach($array as $value) { 
    $dbconn = check_dbconn($dbconn); 
    $sql="insert into collected values('".$value."')"; 
    $res=mysql_query($sql, $dbconn); 
    //then some extra code. 
} 
+0

感謝這個簡單而精彩的答案。它爲我工作。所有冰雹@galador – 2011-06-03 19:02:47

+0

這是一個很好的答案。從來沒有聽說過使用它來解決這些限制。 – 2011-06-03 19:04:35

3

我認爲如果你把你的值放在一個csv文件中並且使用加載數據語法會更好。

編輯。例如

讓我們假設你有所有你的價值觀

value1 
value2 
value3 
and so on 

一個txt文件一旦你創建你的表結構

create table mytest (
id int not null auto_increment primary key, 
myvalue varchar(50) 
) engine = myisam; 

,並上傳你的txt文件,你可以做這樣的事情

load data infile 'myfile.txt' 
into table mytest (myvalue); 
+1

您能否在一些示例中提供以證明您的陳述? – 2011-06-03 18:48:22

+0

請檢查我剛剛提供的問題的註釋部分。 – 2011-06-03 18:55:08

+1

您確定無法使用加載數據嗎?而不是做很多插入查詢,你可以使用多插入查詢。像插入表(your_field)值(x),(y),(z)...這比你的方法快。 – 2011-06-03 19:00:13

0

我認爲@ nick的答案是最好的 - 但另一種方法可能是編寫SQL來創建一個n SP列出所有插入,即作爲一個大字符串,通過線路發送,執行SP並刪除它。

我自己也是MSSQL的人,我絕不會推薦這個 - 但這是我不得不依靠MSSQL自有品牌的批量上傳功能而在傳球中使用的那種瘋狂的黑客攻擊。

或者,您可以在SQL中構建多個插入語句並將其作爲單個命令發送到數據庫?再次抱歉,不是一個MySQL專家,但這是非常有可能在其他數據庫。

+0

我沒有這麼多的訪問權限在服務器上。我的數據庫帳戶只能插入值,沒有其他值。它對mySQL DB有一個約束。我無法使用CSV或任何其他的東西。 – 2011-06-03 18:53:47

+0

mySQL可以接受插入多個插入的SQL指令 - 即不能作爲SP。在這種情況下,將插入物分成批次。 – 2011-06-03 18:56:40

0

如果您可以使用MySQL事務並以批次的形式發出數百個查詢,例如每次數百個查詢,它可能會提高插入的可靠性和速度。

相關問題