PHP导致高SQL负载

时间:2012-07-26 08:14:06

标签: php mysql load flush

我需要将csv中的70,000个条目导入SQL数据库。遗憾的是,这会导致极高的服务器负载并最终导致服务器崩溃。我正在阅读关于大规模SQL导入http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/的文章,并且它提到需要刷新'最简单的方法是创建一个简单的方法来定期清除这些集合。'

然后非常快速地运行脚本,虽然它是另一种语言,但是有替代方案吗?用于冲洗或垃圾收集。在一个循环中导入70,000个条目的最佳方法是什么?

文章还提到使用MySQL索引来减少负载,我如何在PHP中处理它?<​​/ p>

由于

P.s你还认为它是SQL还是CSV阅读器?

1 个答案:

答案 0 :(得分: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

现在您拥有源表的精确副本,您可以使用它,而不必担心导入时“站点关闭”的后果。

新建表上的DISABLE索引

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);
表上的

ENABLE索引(影子表)

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。 导入过程中禁用的所有内容都应在导入结束时启用