缓慢插入&更新到大表

时间:2017-01-13 07:07:18

标签: php mysql innodb

所以我写了一个脚本,它将数据从一行超过1.5米的csv文件导入mysql innodb表,它将扫描CSV,然后扫描每个CSV行:

  • 在表格中搜索以检查记录是否已存在。
  • 如果存在,请更新记录。
  • 如果没有,请插入新的。

然后转到CSV的下一行并再次执行上述步骤。

问题是,导入数据的表还有1.5米的记录,这使得导入数据的速度太慢。我尝试了脚本,看到了:

  • 如果将数据导入空表,则每分钟可以导入500行。
  • 如果将数据导入该1.5m记录表,则每分钟只能导入30行。

是否有任何解决方案可以加快导入进度?

1 个答案:

答案 0 :(得分:0)

问题的根源是:

您在表中搜索要插入的密钥,但是当您执行插入时,数据库管理系统也会执行完整性检查,即确保没有NULL值标记为NOT NULL的列,检查是否未违反外键约束,以及(在这种情况下最重要),确保主键和唯一字段是唯一的。

这意味着当您执行INSERT使您的早期搜索多余时,DBMS将(除其他外)搜索该项目。

您可以将3个操作替换为类似的操作:

INSERT INTO tablename(column1,column2...) 
VALUES (v1,v2,....) 
ON DUPLICATE KEY UPDATE SET column1=v1...

同样有用的是知道如果你说column1=VALUES(column1)这意味着"使用我在插入的VALUES()部分中指定的值。