我有一个PHP脚本可以从文本文件中导入各种数据。
导入非常复杂,我的测试文件有32.000个。这些必须解析并插入到mysql数据库中。
如果我将运行我的脚本,它需要30分钟才能完成......而此时我的服务器cpu是99%空闲。
是否有机会优化php和mysql,他们正在使用更多来自机器的电源?
代码:
if ($handle = @fopen($filename, "r")) {
$canceled = false;
$item = null;
$result = null;
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$line = $buffer;
if (substr($line, 0, 2) == '00') {
continue;
}
else if (substr($line, 0, 2) == '99') {
continue;
}
else if (strlen($line) < 75) {
continue;
}
Reread:
if ($canceled) {
break;
}
if ($item == null) {
$item = new DA11_Item();
$item->boq_id = $boq_id;
}
$result = $this->add_line_into_item($item, $line);
if ($result == self::RESULT_CLOSED) {
$this->add_item($item);
$item = null;
}
else if ($result == self::RESULT_REREAD) {
$this->add_item($item);
$item = null;
goto Reread;
}
else if ($result == self::RESULT_IGNORD) {
if (count($item->details()) > 0) {
$this->add_item($item);
}
$item = null;
}
}
if ($item !== NULL) {
$this->add_item($item);
}
fclose($handle);
}
add_item将执行$ item-&gt; save()并将其保存到数据库。
谢谢和亲切的问候, viperneo答案 0 :(得分:1)
您遇到的一个问题是每个插入都是对您的数据库服务器的单独请求,包括它的响应。有32.000条记录你可能会有一个想法,这是一个非常巨大的开销。一次使用批量插入(假设)1000条记录
INSERT INTO foo (col1, col2) VALUES
(1,'2'),
(3,'4')
-- 997 additional rows
(1999, '2000');
其他交易可能会有所帮助
更新,因为您提到了活动记录:我建议避免为此类批量导入任务提供任何额外的抽象层。
答案 1 :(得分:0)
正如Florent在评论中所说,MySQL引擎太慢而无法处理请求。将MySQL数据库移动到SSD(而不是HDD)将显着提高速度。
答案 2 :(得分:0)
有些事情可以优化。
但我认为性能最高的是MySQL数据库。有时,连接表上的某些索引可能带来很大的速度。你应该先检查一下。
当你有一个linux系统时,你可以使用 mysqltuner 来优化你的数据库。
第二种方法是优化代码并在之前完成相同的操作时从数据库中缓存一些结果。