我有一张包含大量数据的Excel工作表。我正在使用php将数据插入到mysql服务器中。
我有两个问题
1)如果id已经存在,我必须更新一行,否则插入数据。
2)大问题:我有超过40,000行,并且由管理员设置的sql server上的超时为60秒。当我运行更新/插入查询时,它将花费超过60秒,因此会有超时。所以整个过程都会失败。
我有办法做到这一点吗?
目前我正在检查学生ID是否存在,然后更新,否则插入。我觉得这需要花费很多时间并导致服务器超时。
此外,我在mysql中有这个字段,说明最后一次更新数据(last_update)。我正在考虑使用这个日期,如果它已经过了一个特定的日期(即我上次运行程序),那么只应更新那些行。
无论如何这会有所帮助吗?
我可以运行的查询是什么,以便在mysql数据库中检查此日期,如果它超过特定日期,则只需要更新那些行,而不是其他所有行。 (请帮我解决上面的例子!!!!!!!!!!!!!!!!!)
答案 0 :(得分:1)
假设您正在使用InnoDB引擎(在最新的MySQL版本中是默认的),您应该只使用事务:将您的插入循环包装到BEGIN; ......承诺;块。
默认情况下,每个语句都作为事务运行,并且服务器必须确保数据在继续下一个语句之前安全地将其安装到磁盘。如果启动事务,然后执行许多插入,然后提交事务,则服务器必须将所有数据刷新到磁盘上。在现代硬件上,这可能只占很少的磁盘操作而不是500k。 另一个考虑因素是使用prepared statements。服务器必须在执行之前解析每个SQL语句。这种解析不是免费的,并且解析时间可能比实际查询执行时间更昂贵并不罕见。通常,这种解析每次都会完成,对于你的情况,它完成了500k次。如果使用预准备语句,则解析/准备只执行一次,执行语句的成本仅为磁盘写入(如果您在活动事务中,则会进一步增强,因为服务器可以通过延迟写入来批处理,直到事务提交为止)。 / p>
使用这些方法的总体改进可能非常显着 - 我已经看到使用交易时的总运行时间从30分钟缩短到20秒。