我需要将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阅读器?
答案 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
。
导入过程中禁用的所有内容都应在导入结束时启用。