2012-07-26 105 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