2012-07-26 142 views
0

我需要從csv導入70,000個條目到SQL數據庫中。這不幸的是造成了極高的服務器負載並最終導致服務器崩潰。我正在閱讀這篇關於大規模SQL導入http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/的文章,並提到需要刷新'處理這個問題的最簡單方法是創建一個簡單方法來定期清除這些集合。PHP導致高SQL負載

那然後運行該腳本非常快,雖然它是用另一種語言是有一個PHP替代?無論是沖洗還是垃圾收集。在一個循環中導入70,000個條目的最佳方法是什麼?

文章還提到使用MySQL索引以減少負載,我如何在PHP中處理這個呢?

感謝

P.S還有你認爲它是SQL或者是它的CSV讀者?

+0

給我們看一些代碼。 – Tomer 2012-07-26 08:16:13

+0

你要輸入什麼樣的記錄? 70.000不是很多。你有沒有檢查http://dev.mysql.com/doc/refman/5.1/en/load-data.html? – Sherlock 2012-07-26 08:16:36

+0

我從csv文檔導入條目,因此它抓住輸入到給定表中的行。 – user1264204 2012-07-26 08:24:46

回答

0

你可以嘗試下一個:

做一個TableShadowCopy。 (如果是活的表,這樣你將避免網站掛,否則你可以跳過這一步)

DROP TABLE IF EXISTS __shadow_table; // droping previous shadow table if exists 
CREATE TABLE __shadow_table LIKE table; // COPY source table structue 
CREATE TABLE IF NOT EXISTS __shadow_table SELECT * FROM table; // possible use of WHERE statemnet 

現在,你有你的源表的精確副本,你可以用它做你不必擔心什麼導入時「網站停止」的後果。

禁用索引在新創建的表

ALTER TABLE __shadow_table DISABLE KEYS; 

現在你可以做你的導入表(__shadow_table)。

嘗試LOAD DATA LOCAL INFILE(需要FILE許可)

如果您有沒有FILE許可使用BULK INSERT

INSERT INTO __shadow_table (col1, col2, col3, col4) VALUES (1,2,3,4), (6,7,8,9), (20,30,40,60); 

啓用索引在桌子上(影子表)

ALTER TABLE __shadow_table ENABLE KEYS; 

DROP原始表

DROP TABLE IF EXISTS table 

RENAME影子表到原始(DROP PED)名稱

RENAME TABLE __shadow_table TO table; 

禁用索引而進口允許減少負載和HDD插入數據時搜索。此外,如果表格爲InnoDB,則應禁用FOREIGN_KEY_CHECKS。 一切都在導入過程中什麼是禁用應該由進口月底啓用

+0

將嘗試所有這些感謝全面的反應保羅! – user1264204 2012-07-26 10:10:13

+0

歡迎您!我們在Live環境中開發並使用了類似的技術,並且工作非常流暢。非常大的數據量+沒有服務中斷。這就是你得到的。 – 2012-07-26 19:13:56