1

我有一个 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->save() 并将其保存到数据库中。

谢谢和亲切的问候, viperneo

4

3 回答 3

1

您遇到的一个问题是,每个插入都是对您的数据库服务器的单独请求,包括它的响应。有了 32.000 条记录,您可能会想到,这是一个相当大的开销。一次对(比如说)1000 条记录使用批量插入

INSERT INTO foo (col1, col2) VALUES
  (1,'2'),
  (3,'4')
  -- 997 additional rows
  (1999, '2000');

额外的交易可能会有所帮助

更新,因为您提到了活动记录:我建议避免为此类大规模导入任务添加任何额外的抽象层。

于 2012-08-07T11:48:49.583 回答
0

正如 Florent 在评论中所说,MySQL 引擎处理请求的速度太慢。将 MySQL 数据库移动到 SSD(而不是 HDD)将显着提高速度。

于 2012-08-07T11:47:54.357 回答
0

有一些东西可以优化。

但我认为最好的性能是你的 MySQL 数据库。有时,连接表上的某些索引可能会带来很大的速度。你应该首先检查一下。

当你有一个 linux 系统时,你可以使用mysqltuner来优化你的数据库。

第二种方法是优化您的代码并缓存数据库中的一些结果,当您以前做过同样的事情时。

于 2012-08-07T11:48:23.590 回答