php - 将大型 Excel 文件插入数据库

标签 php mysql excel bulk-load spout

我正在使用Spout用于读取超过 500.000 条记录的 Excel 文件(每列 7 列,信息不多)。

问题是我的脚本超时了。 我已经尝试上传此限制,结果变得更好,但到目前为止我无法进行完整的插入,仅部分插入大约 50.000 行。

这对我来说不是一个选择。 除了代码之外,还有什么方法可以拆分这个 Excel 文件吗? 我看到的是,即使文件没有插入数据库,操作文件也已经很慢并且超时。

那么...有什么建议吗?

谢谢!

最佳答案

您可以尝试调用set_time_limit()重复地,例如在插入的每一行之后。每次您调用它时,它都会重置时间限制。但是,如果您的服务器管理员设置了全局时间限制,则您将无法超过该限制。

但是,将 50 万行逐一插入 MySQL 中的 InnoDB 表本质上很慢,因为它需要在每一行之后执行自动提交。

如果你批量插入,你会获得很多速度。例如,您现在可能正在做这样的事情:

  INSERT INTO table (col1, col2, col3) VALUES (1, 'baker', 'charlie');
  INSERT INTO table (col1, col2, col3) VALUES (2, 'delta', 'echo');
  INSERT INTO table (col1, col2, col3) VALUES (3, 'foxtrot', 'golf');
  INSERT INTO table (col1, col2, col3) VALUES (4, 'hotel', 'india');
  INSERT INTO table (col1, col2, col3) VALUES (5, 'lima', 'mike');

而是这样做:

  INSERT INTO table (col1, col2, col3) VALUES 
     (1, 'baker', 'charlie'),
     (2, 'delta', 'echo'),
     (3, 'foxtrot', 'golf'),
     (4, 'hotel', 'india'),
     (5, 'lima', 'mike');

这样,您将在 MySQL 上产生每五行而不是每一行的提交开销。请注意,您可以将许多行放入单个 INSERT 中,而不仅仅是 5 行。 MySQL 对查询长度的唯一限制可以通过SHOW VARIABLES LIKE 'max_allowed_packet'; 找到。 .

当然,这编程起来有点复杂,但速度快得多

关于php - 将大型 Excel 文件插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51496522/

相关文章:

VBA 将行高与粘贴图像大小相匹配

C# Interop 使用特定列的数据获取最后一行

php - 创建新的 symfony 项目时出错

javascript - 想要使用 jquery 从 php 获取的 json 填充数据列表

mysql - 如何查找两个日期之间每小时的销售额

mysql max_user_connections 和 innodb 与 myisam

vba - 如果语句在 Excel VBA 中不起作用

php - 如何从此数组获取youtube下载链接

php - htaccess 在我的本地主机上不起作用

php - CakePHP WAMP - 数据库 Mysql 连接丢失