Php 慢插入&;更新为大表

Php 慢插入&;更新为大表,php,mysql,innodb,Php,Mysql,Innodb,因此,我编写了一个脚本,将超过150万行的csv文件中的数据导入mysql innodb表,它将扫描csv,然后针对每个csv行: 在表中搜索以检查记录是否已存在 如果存在,则更新记录 如果没有,请插入新的 然后转到CSV中的下一行,再次执行上述步骤 问题是,将导入数据的表也有150万条记录,这使得导入数据的速度太慢。我试过剧本,看到了: 如果将数据导入空表,它每分钟可以导入500行 如果将数据导入1.5m记录表,则每分钟只能导入30行 是否有任何解决方案可以加快导入进度?问题的根源在于

因此,我编写了一个脚本,将超过150万行的csv文件中的数据导入mysql innodb表,它将扫描csv,然后针对每个csv行:

  • 在表中搜索以检查记录是否已存在
  • 如果存在,则更新记录
  • 如果没有,请插入新的
然后转到CSV中的下一行,再次执行上述步骤

问题是,将导入数据的表也有150万条记录,这使得导入数据的速度太慢。我试过剧本,看到了:

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

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

问题的根源在于:

您在表中搜索要插入的键,但是,当您执行插入时,数据库管理系统还将执行完整性检查,即确保标记为
非NULL
的列上没有
NULL
值,检查是否违反外键约束,以及(在本例中最重要的是),确保主键和唯一字段是唯一的

这意味着,当您执行
INSERT
时,DBMS将(除其他外)搜索该项,从而使先前的搜索变得多余

您可以将这3个操作替换为一个单独的操作,如下所示:

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

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

问题的根源是:

您可以在表中搜索要插入的键,但是,当您执行插入时,数据库管理系统还将执行完整性检查,即确保标记为
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()
部分中指定的值

可能将这三个步骤替换为插入到。。。在重复密钥更新时
INSERT
已经执行了重复键检查,使您自己的检查变得多余。您可以显示您的表结构吗?您需要在这里给出一个示例,如
show CREATE table
,它描述了您的表和相关索引。正如@apokryfos所说,“复制键上的
才是真正的解决方案,它一步到位,没有混乱。您甚至可以直接从CSV文件中插入。对于IODKU,您需要一个合适的
唯一
索引来确定它何时是“重复的”。@apokryfos请将您的评论作为实际答案,以便我可以将其标记为已接受。也许可以用单个
插入替换这3个步骤。。。在重复密钥更新时
INSERT
已经执行了重复键检查,使您自己的检查变得多余。您可以显示您的表结构吗?您需要在这里给出一个示例,如
show CREATE table
,它描述了您的表和相关索引。正如@apokryfos所说,“复制键上的
才是真正的解决方案,它一步到位,没有混乱。您甚至可以直接从CSV文件插入。对于IODKU,您需要一个合适的
唯一
索引来确定它何时是“重复的”。@apokryfos请将您的评论作为实际答案,以便我可以将其标记为已接受。谢谢!通过使用此解决方案,导入速度从30个订单/分钟显著提高到4000个订单/分钟!更多信息,当一个表太大时,如果使用
selectwhere
query,执行它需要很长的时间(6秒),这就是问题所在。我认为
Insert on duplicate key
东西只会插入行而不检查,如果返回重复的异常,就会变成
update
查询。谢谢!通过使用此解决方案,导入速度从30个订单/分钟显著提高到4000个订单/分钟!更多信息,当一个表太大时,如果使用
selectwhere
query,执行它需要很长的时间(6秒),这就是问题所在。我认为
Insert on duplicate key
东西只会插入行而不进行检查,如果返回重复的异常,就会变成
update
查询。