【问题标题】:PhpMyAdmin data import performance issuesPhpMyAdmin 数据导入性能问题
【发布时间】:2012-05-13 01:21:57
【问题描述】:

最初,我的问题与 PhpMyAdmin 的 SQL 部分无法正常工作有关。正如 cmets 中所建议的,我意识到这是无法处理的输入量。但是,这并没有为我提供一个有效的解决方案,说明如何处理具有 (CSV) 格式的文件(在我的情况下 - 35,000 条记录行):

...
20120509,126,1590.6,0
20120509,127,1590.7,1
20120509,129,1590.7,6
...

PhpMyadmin 中的 Import 选项与 SQL 部分中的基本复制粘贴输入一样苦苦挣扎。这一次,和以前一样,需要 5 分钟,直到调用最大执行时间,然后停止。有趣的是,它在表中添加了 6-7 千条记录。所以这意味着输入实际上通过并且几乎成功地做到了。我还尝试将文件中的数据量减半。然而什么都没有改变。

现在显然有问题。当简单的数据导入不起作用时,不得不在 php 脚本中处理数据是很烦人的。

【问题讨论】:

  • 好战的 retaggers 是好战的 ;)
  • 你确定它正在上传运行吗?听起来 Web 界面上传到服务器的输入太大了。为什么不直接从 PHP 执行?
  • 嗯,现在我觉得问这个问题很愚蠢。但我记得在从文件中添加数据时遇到问题。如果需要,需要对此进行测试并更新或删除答案。感谢您指出显而易见的事情。
  • 更新了一般问题以指出关键问题。最初的问题只是问题的一小部分。

标签: mysql performance phpmyadmin file-import


【解决方案1】:

更改您的 php 上传最大大小。

你知道你的 php.ini 文件在哪里吗?

首先,尝试将此文件放入您的网络根目录:

phpinfo.php

(见http://php.net/manual/en/function.phpinfo.php

包含:

<?php

phpinfo();

?>

然后导航到http://www.yoursite.com/phpinfo.php

寻找“php.ini”。

要上传大文件,您需要 max_execution_time、post_max_size、upload_max_filesize

另外,您知道您的 error.log 文件在哪里吗?希望它可以为您提供有关问题所在的线索。

编辑:

这是我用于文件导入的查询:

$query = "LOAD DATA LOCAL INFILE '$file_name' INTO TABLE `$table_name` FIELDS TERMINATED BY ',' OPTIONALLY
    ENCLOSED BY '\"' LINES TERMINATED BY '$nl'";

其中 $file_name 是来自 php 全局变量 $_FILES 的临时文件名,$table_name 是已经准备好导入的表,$nl 是 csv 行结尾的变量(默认为 windows 行结尾,但我可以选择选择 linux 行尾)。

另一件事是我的脚本中的表($table_name)是预先准备好的,首先扫描csv以确定列类型。在确定适当的列类型后,它会创建 MySQL 表来接收数据。

我建议您先尝试创建 MySQL 表定义,以匹配文件中的内容(数据类型、字符长度等)。然后尝试上面的查询,看看它运行的速度有多快。我不知道 MySQL 表定义对速度的影响有多大。

另外,在加载数据之前,我没有在表中定义索引。索引会减慢数据加载速度。

【讨论】:

  • 当我从 php 脚本执行一些查询时,会立即插入 10k 条记录。我进行了测试,它每秒添加约 18k 条记录。但是,它无法处理非常大的查询(抛出错误:mysql 服务器已消失),所以我分成 10k 条记录的部分来插入,它做得很好。当我尝试使用 PhpMyAdmin 从 CVS/Excel 文件导入时,脚本正在执行某些操作(不确定如何检查到底是什么),5 分钟后它停止达到最大执行时间。我发现它在数据库中添加了 6-7k 行。
  • 我能说的是:它必须达到数据插入的状态,但无法完成。我猜想上传除 SQL 之外的任何内容的插件(同样,以 10k 左右的块,但不是更多)不适合大块数据,但同样,这不太可能。上传最大文件大小不是问题,文件远低于它。关于 post_max_size:如果它太大,它不会停止进程吗?一般来说,什么需要 5 分钟?为什么它不会抛出一个错误,说超出了某个变量? 5 分钟内 10k 条记录是荒谬的 :(
  • 我在想,因为它正在尝试将所有数据添加到一个查询中(与我尝试的相同,但出现即时错误,因此将其减少到每个 10k),因此很难解决,但我找到了真的很奇怪,如此大规模项目的创建者不会考虑上传大文件而不是将它们分成更小的查询。
  • 我正在使用 2 兆字节以上的 csv 文件测试我当前的 PHP/MySQL 程序。实际上我想我什至有一个 5 或 10 MB 的。您是否试图将所有数据加载到一张表中?如果是这样,“加载数据输入文件”是您应该使用的方法。 dev.mysql.com/doc/refman/5.1/en/load-data.html 我用它将数据放入“原始”表中。然后我从那里做进一步的处理。
  • 好吧,我正在使用 PhpMyAdmin 提供的东西,这显然不能正常工作。我可以轻松地使用一些自己编写的 php 脚本来上传所有数据(我认为这将是一个解决方案)。然而,这只是一个轻微的不便,但是非常烦人的是 PhpMyAdmin 有一些必须在发布前修复的错误。
猜你喜欢
  • 2014-07-16
  • 2011-05-08
  • 2012-01-05
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2016-08-21
相关资源
最近更新 更多