【问题标题】:What is limiting the number of SQL statements PHP executes before timing out?什么限制了 PHP 在超时之前执行的 SQL 语句的数量?
【发布时间】:2018-02-17 15:22:32
【问题描述】:

我正在尝试使用这样编写的 SQL 语句将大量记录导入我的表中:

INSERT INTO itemlist(UPC_Case,Pack,Size,Description,Weight_Case,UPC_Retail,TI,HI,MCL,CM,GSC,FL,HAN) VALUES (<values>);

其中一长串位于名为 itemlist insert.sql 的文本文件中

我决定使用 phpmyadmin 导入这些文件,但整个文件不会上传,所以我将其拆分并压缩,当我运行导入时,它运行了几分钟,然后才通过 ~3850 记录(~850,000 个位置) 在超时之前,这绝对让我感到震惊,因为做太少 3850 条记录似乎是在大约 5 分钟内处理的非常少量的数据(我的意思是必须是什么,> 1MB?),所以我认为与脚本执行相关的 php 设置对于这种导入必须设置得太低,所以我按照this post 并更改了他们提到的设置:

/etc/php/7.0/apache2/php.ini:

post_max_size = 30M (was 8M)
upload_max_filesize = 30M (was 2M)
memory_limit = 1G (was 128M)
max_execution_time = 60 (was 30)
max_input_time = 120 (was 60)

然后我重启了apache:sudo systemctl restart apache2

我知道设置已被应用,因为最大文件大小确实发生了变化,这意味着我不必压缩我的文件,我认为结合其他更改,不仅有助于更快地处理 SQL 语句,而且它还有两倍的时间才能用完;这意味着在脚本超时之前至少会处理两倍,对吧?

但根本没有改善。 phpmyadmin 在超时之前仍然只能通过~3850 条记录(~850,000 个位置)。

为什么没有改进,是什么限制了被处理的语句数量,因为它不是那些 PHP 设置中的任何一个。 phpmyadmin 是否有某种隐藏限制?

【问题讨论】:

  • 一定是另外一回事,可能和MySQL有关,因为你的最大执行时间是30秒(现在是60秒)但是你说脚本运行了5分钟才超时,所以看起来PHPMyAdmin 正在以某种方式解决这个限制。另外,我不确定您所说的“职位”是什么意思,但在五分钟内插入 850.000 行并不是一个坏数字。
  • 我也不知道位置是什么意思,但这就是每次脚本停止时的意思。我认为它接近等同于“角色”的意思。这意味着不,不是 850,000 行,而是少于 4,000
  • 在这种情况下,是的,对于一个包含十几个字段的表中的 4000 行来说,5 分钟已经很多了,IMO 这表明 MySQL 存在问题。

标签: mysql sql phpmyadmin


【解决方案1】:

PHPMyAdmin 不是一个工具,旨在将大文件导入 Mysql。

尝试使用mysql 命令行工具。

在 Unix/Mac 的情况下:

mysql -u {username} -p{password} {database_name} < import_file.sql

适用于所有操作系统:

mysql -u {username} -p{password} -e "\. import_file.sql" {database_name}

关于导入慢的可能原因,通常是:表已经有很多记录,该表上的唯一索引,触发器,服务器慢,连接慢。

【讨论】:

  • 我现在正在尝试命令行,我会告诉你需要多长时间或者是否超时。至于可能的原因(按原顺序):表是空的;只有一个唯一的AUTO_INCREMENT ID 字段;不确定您所说的“触发器”是什么意思;服务器很慢,但肯定不足以解决这个问题;没有连接,这是在 localhost 上运行的。
  • 我会接受这个答案,因为虽然它似乎并没有变得更快,但我不必一遍又一遍地恢复它,所有查询从头到尾都没有中断。跨度>
【解决方案2】:

可能值得注意的是,虽然我不知道这是你的问题,但 MySQL 也有超时设置。
如果您超过 MySQL 超时,那么您的查询也会失败。
这是一个stack overflow answer,它应该解释你在超时时需要什么。

由于您具有命令行访问权限,并且如果导出的数据是 SQL 格式,您可以在命令行中导入。这种方法可能会回避您遇到的问题,(基本上是您run the exported data as a script)。


希望对您有所帮助!

【讨论】:

  • 谢谢,我确实尝试通过 CLI 运行它,虽然它似乎没有运行得更快,但它确实执行了所有语句而没有超时。
  • 另外,值得注意的是,我为使用 CLI 编辑了错误的 php.ini (/etc/php/7.0/apache2/php.ini),正确的应该是 /etc/php/7.0/cli/php.ini
  • @MarkKramer 很高兴它起作用了,这通常是我在导入时采用的方法。有趣的是,出口似乎如此完美。我还从转储文件中获取 SQL 并将其复制到 PHPMyAdmin 中的 SQL 框中并让它工作......但当数据库有大量数据时,我认为我从来没有这样做过。跨度>
  • 哇,我只需要重做这张桌子,我就知道为什么花了这么长时间。这只是因为我每条记录都有一个插入语句。当我不得不重做相同的事情时,我将每条记录都放在一个插入语句中,并且只需要几分钟。在它必须整天运行之前。
  • @MarkKramer 这绝对是有价值的信息。
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2021-08-16
相关资源
最近更新 更多