所以我写了一个脚本,将数据从超过 1.5m 行的 csv 文件导入到 mysql innodb 表中,它将扫描 CSV,然后对于每个 CSV 行:
- 在表中搜索以检查记录是否已存在。
- 如果存在,请更新记录。
- 如果没有,请插入新的。
然后转到CSV中的下一行,然后再次执行上述步骤。
问题是,数据将导入到的表也有 1.5m 条记录,这使得导入数据的速度太慢。我尝试了脚本,看到:
- 如果将数据导入空表,则每分钟可以导入 500 行。
- 如果将数据导入到该 1.5m 记录表,则每分钟只能导入 30 行。
有什么解决方案可以使导入进度更快吗?
问题的根源是这样的:
您在表中搜索要插入的键,但是当您执行插入时,数据库管理系统还将执行完整性检查,即确保标记为NOT NULL
的列上没有NULL
值,检查是否未违反外键约束,以及(在这种情况下最重要的是)确保主键和唯一字段是唯一的。
这意味着当您执行INSERT
时,DBMS 将(除其他事项外)搜索该项目,从而使您之前的搜索变得多余。
您可以将 3 个操作替换为一个操作,如下所示:
INSERT INTO tablename(column1,column2...)
VALUES (v1,v2,....)
ON DUPLICATE KEY UPDATE SET column1=v1...
同样有用的是,如果您说column1=VALUES(column1)
这意味着"使用我在插入VALUES()
部分中指定的值。