2012-06-10 80 views
5

所以我試圖插入250 000行到我的數據庫。因爲這只是樣本數據,我只需要查詢變化的x,y變量,因此for循環和僅僅是'水'的地形快速插入250k行

但是這是永遠的。任何人都知道我能如何更快地做到這一點?

ini_set('max_execution_time', 70000); 

$conn = mysql_connect('localhost', 'root', '') or die(mysql_error()); 
mysql_select_db('hol', $conn) or die(mysql_error()); 

for ($y=0;$y<500;$y++) { 
    for ($x=0;$x<500;$x++) { 
     mysql_query("INSERT INTO map(x, y, terrain) VALUES($x, $y, 'water')"); 
    } 
} 
+2

「很快」和「25000」不能很好地攜手,特別是沒有250K個人查詢!採取@ yes123的建議,並使用1個查詢插入所有值,或者至少在字符串變得太長時插入所有值。 – Bojangles

+0

爲什麼我會感覺到,你真正需要的是從另一個數據庫導入數據? –

+0

你簡直錯了,我很害怕。這只是插入一些上面提供的示例數據。 – josmith

回答

8

使用MySQL LOAD DATA FROM INFILE語句可能會更好。批量加載往往比構建大量插入語句字符串更快。將數據寫入文件並執行一次LOAD。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

插入/負載也取決於此表的索引數。僅在必要的列上創建索引。在將數據加載到表中之後,通過添加索引,您還經常可以獲得更好的性能,以便在添加數據時不更新索引。

+0

有趣。問題是,在我甚至可以開始執行單一負載之前將所有數據寫入文件需要多長時間 – josmith

+1

@josmith依賴於磁盤IO活動,磁盤速度,如果將文件寫入RAMdisk等 – damianb

+0

同意。實際上,我傾向於遇到大單個文件特別是文本文件的問題。但我不太清楚爲什麼。 – josmith

3
INSERT INTO map (x, y, terrain) 
VALUES ($x, $y, 'water'), ($x, $y, 'water') [etc] 

所以你只需要1個查詢。

當然將查詢到多個查詢時,您已經添加400-500值

+0

是的,但250k行的字符串長度會很長。 – 2012-06-10 21:10:56

+0

@Dagon:啓動查詢時,它有500個值 – dynamic

+0

以及編輯,我同意:-) – 2012-06-10 21:13:06

2

你應該確保你沒有運行在那些250.000自動提交模式(250.000交易)。

通過將它們全部發送到一個事務中,您將加速相當多的事情,因爲mysql引擎不必調用它的事務機制250.000次。

CF PHP + MySQL transactions examples

mysql_query("START TRANSACTION"); 
... your requests 
mysql_query("COMMIT"); 

如果你不關心索引的狀態,你也應該在開始交易之前刪除您在該表上的索引後重新創建。這也會加速很多事情,因爲引擎不需要檢查唯一性,更新索引,對於每一行。

+0

因此mysql_query(「BEGIN」);會做一個大交易? – josmith

+0

使用更標準的「START TRANSACTION」。請讓我更新速度的差異。如果你正在使用像Mysql InnoDB這樣的事務引擎,它應該有所作爲。 –

+1

如何在mysql內部處理事務?將所有250,000行保存在內存中直到事務提交? –

0

很明顯,因爲第一條語句只有500個值,所以插入值的方式並不那麼重要,您可以使用循環來完成此操作。

INSERT INTO temp500 (value) 
    VALUES (0), (1), (2), ... (499); 
INSERT INTO map (x, y, terrain) 
    SELECT x.value, y.value, 'water' 
    FROM temp500 x, temp500 y;