0

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

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

文章还提到使用 MySQL 索引来减少负载,我如何在 PHP 中也解决这个问题?

谢谢

Ps 另外你认为它是 SQL 还是 CSV 阅读器?

4

1 回答 1

0

您可以尝试下一个:

做一个TableShadowCopy。(如果是live table,这样可以避免网站挂起,否则可以跳过这一步)

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);

ENABLE表上的索引(影子表)

ALTER TABLE __shadow_table ENABLE KEYS;

DROP原始表

DROP TABLE IF EXISTS table

将影子表重命名为原始 ( DROPped) 名称

RENAME TABLE __shadow_table TO table;

导入时禁用索引可以减少插入数据时的负载和 HDD 搜索。此外,如果表是InnoDBFOREIGN_KEY_CHECKS则应禁用。导入期间禁用的所有内容都应在导入结束时启用

于 2012-07-26T08:29:17.780 回答