【问题标题】:Best way to insert and query a lot of data MySQL插入和查询大量数据 MySQL 的最佳方法
【发布时间】:2022-03-30 16:55:41
【问题描述】:

我必须从 xls 文件中读取最多 6 列的大约 5000 行。我正在使用 PHP >= 5.3。我将使用 PHPExcel 来完成这项任务。我没有尝试过,但我认为它可以处理(如果您有其他选择,欢迎他们)。 问题是每次读取一行时,我都需要查询数据库以验证该特定行是否存在,如果存在,则覆盖它,如果不存在,则添加它。 我认为这将花费大量时间,PHP 只会超时(我无法修改 timeout 变量,因为它是共享服务器)。 你能帮我解决这个问题吗? 感谢您的帮助

【问题讨论】:

  • 你能提供更多信息吗?您在使用任何框架等吗?
  • 是的。我正在使用 CodeIgniter 2.2 ,但由于它的 orm 有点像包装器,我认为不会影响性能,对吗?

标签: mysql sql phpexcel bulkinsert


【解决方案1】:

由于您使用的是 MySQL,您所要做的就是插入数据,而不用担心存在一行。 以下是原因和方法:

  • 如果您从 PHP 查询数据库以验证是否存在某行,那就太糟糕了。它不好的原因是因为你很容易得到错误的结果。 PHP 和 MySQL 之间存在滞后,无法使用 PHP 来验证数据完整性。这就是数据库的工作。

  • 为确保没有重复的行,我们在列上使用UNIQUE 约束。

  • MySQL 使用INSERT INTO ... ON DUPLICATE KEY UPDATE 语法扩展了 SQL 标准。这让您只需插入数据,如果有重复的行 - 您可以用新数据更新它。

  • 读取 5000 行很快。如果将其包装在事务中,插入 5000 也很快。我建议从 excel 文件中读取 100 行,开始事务并插入数据(使用 ON DUPLICATE KEY UPDATE 处理重复项)。这将使您花费 1 个硬盘驱动器的 I/O 来保存 100 条记录。这样做,您可以在几秒钟内完成整个过程,让您不必担心性能或超时。

【讨论】:

  • Insert into ... on duplicate key update 这很好,但是在每次查询时都会自动增加主自动增量索引... PHPExcel 中的 5000 riiws 并不快,它取决于 hositng
  • @AndreyVorobyev - 你所说的根本不是真的。我从事的项目已经够多了,所以我从经验中谈起。 1 秒内可插入 5000 次。您只需要具备正确使用该软件的知识。 5000 个数字在一微秒内自动递增。
  • @AndreyVorobyev - 你的意思是什么?我不知道这和我的回答有什么关系。我回答了如何快速执行插入并避免重复,这正是 OP 所要求的。数据如何到达或被读取不是这个问题的范围,也不是答案。
  • 嘿伙计! @Mjh 我不知道这种方法。我觉得很实用,谢谢!我还没有对其进行基准测试,但是使用 1mb 连接上传文件(600kb)需要 45 秒 -> 使用 PHPExcel 读取数据并将其存储在数组中 -> 调用我的模型并制作一个 for 因为我有一个数组数组(后者将实际信息保存到数据库中),然后最后在每个数组的循环内调用 CodeIgniter 的 orm 的插入函数。我还能改进吗?
  • @user2430929 - 您是否将插入包装在事务中? 1MB 需要 45 秒听起来太长了。
【解决方案2】:

一开始通过exec运行这个进程,超时没关系
其次,在读取excel文件之前选择所有行。一次查询不选择,例如一次读取 2000 行,然后将其收集到数组中。
第三次使用 xlsx 格式和chunkReader,允许读取不整个文件。 这不是 100% 的保证,但我也是这样做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2011-05-06
    • 2010-09-23
    • 2015-10-16
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多