缓慢插入和更新到大 table
Slow insert & update into large table
所以我写了一个脚本,将数据从超过 1.5m 行的 csv 文件导入到 mysql innodb table,它将扫描 CSV,然后对于每个 CSV 行:
- 在 table 中搜索以检查记录是否已存在。
- 如果存在,更新记录。
- 如果没有,插入新的。
然后转到 CSV 中的下一行并再次执行上述步骤。
问题是,要导入数据的table也有1.5m的记录,导致导入数据很慢。我尝试了脚本并看到:
- 如果导入数据到空table,每分钟可以导入500行。
- 如果导入数据到那150万条记录table,每分钟只能导入30行。
有没有什么办法可以让导入进度更快?
问题的根源是这样的:
您在 table 中搜索要插入的键,但是当您执行插入时,数据库管理系统也会执行完整性检查,即确保没有 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()
部分指定的值。
也很有用
所以我写了一个脚本,将数据从超过 1.5m 行的 csv 文件导入到 mysql innodb table,它将扫描 CSV,然后对于每个 CSV 行:
- 在 table 中搜索以检查记录是否已存在。
- 如果存在,更新记录。
- 如果没有,插入新的。
然后转到 CSV 中的下一行并再次执行上述步骤。
问题是,要导入数据的table也有1.5m的记录,导致导入数据很慢。我尝试了脚本并看到:
- 如果导入数据到空table,每分钟可以导入500行。
- 如果导入数据到那150万条记录table,每分钟只能导入30行。
有没有什么办法可以让导入进度更快?
问题的根源是这样的:
您在 table 中搜索要插入的键,但是当您执行插入时,数据库管理系统也会执行完整性检查,即确保没有 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()
部分指定的值。