【问题标题】:How to insert/update a large amount of data into mysql using php如何使用php向mysql中插入/更新大量数据
【发布时间】:2014-05-09 03:49:55
【问题描述】:

我有一张包含大量数据的 Excel 表格。我正在使用 php 将数据插入 mysql 服务器。

我有两个问题

1) 如果 id 已经存在,我必须更新一行,否则插入数据。

2) 大问题:我有超过 40,000 行,并且管理员设置的 sql 服务器上的超时时间是 60 秒。当我运行更新/插入查询时,它将花费超过 60 秒,因此会有超时。所以整个过程都会失败。

有什么办法可以做到吗?

目前我正在检查学生证是否存在,否则更新插入。我觉得这会花费很多时间并导致服务器超时。

我在 mysql 中有这个字段,说明上次更新数据的时间(last_update)。我正在考虑使用这个日期,如果它超过了特定日期(即我上次运行程序),那么只有那些行应该被更新。

这会有帮助吗?

我可以运行什么查询来检查 mysql 数据库中的这个日期,如果它超过了一个特定的日期,只有那些行需要更新,而不是其他所有内容。 (请帮我提供上面的示例查询!!!!!!!!!!!!!!!!!!)

【问题讨论】:

  • 你可以从命令行运行相同的,因为命令行脚本没有超时,除非进程结束或者你杀了它。看看http://www.php.net/manual/en/function.set-time-limit.php
  • 我不能这样做,因为我是为客户做这件事并给他一个浏览器端的功能。而且他的服务器由管理团队控制,无法更改。
  • 在重复键策略上使用插入 ... ,如上所述。并动态改变php的最大执行时间 ini_set('max_execution_time','20M');

标签: php mysql excel bigdata


【解决方案1】:

假设您使用的是 InnoDB 引擎(这是最新 MySQL 版本中的默认引擎),您应该简单地使用事务:将您的插入循环包装到 BEGIN 中; ... 犯罪;块。

默认情况下,每条语句都作为事务运行,服务器必须确保数据在继续执行下一条语句之前安全地存储到磁盘。如果您启动事务,然后执行许多插入,然后提交事务,那么服务器必须将所有数据刷新到磁盘上。在现代硬件上,这可能只相当于很少的磁盘操作,而不是 500k。 另一个考虑是使用prepared statements。服务器必须在执行之前解析每个 SQL 语句。这种解析不是免费的,解析时间可能比实际查询执行时间更昂贵并不罕见。通常,此解析每次都会完成,对于您的情况,它会完成 500k 次。如果您使用准备好的语句,则解析/准备只进行一次,并且执行语句的成本只是磁盘写入(如果您处于活动事务中,则会进一步增强,因为服务器可以通过延迟写入来批量写入,直到事务提交)。

使用这些方法的总体改进可能非常显着 - 我见过使用事务将总运行时间从 30 分钟减少到 20 秒的情况。

http://php.net/manual/en/pdo.prepared-statements.php

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
相关资源
最近更新 更多