php - 大大加快 MySQL 数据库中 1000 万行的插入速度

标签 php mysql insert innodb

$files = glob('dataset/*.xml');

foreach ($files as $key => $txc) {
    $txcDoc = new DOMDocument();
    $txcDoc->load($txc);

    $operators = $txcDoc->getElementsByTagName("Operators");
    foreach ($operators as $operatorTag) {
        foreach ($operatorTag->getElementsByTagName("Operator") as $operator) {
            $reference = $operator->getAttribute("id");
            @$nationalOperatorCode = $operator->getElementsByTagName("NationalOperatorCode")->item(0)->nodeValue;
            $operatorCode = $operator->getElementsByTagName("OperatorCode")->item(0)->nodeValue;
            $operatorShortName = $operator->getElementsByTagName("OperatorShortName")->item(0)->nodeValue;
            @$operatorNameOnLicense = $operator->getElementsByTagName("OperatorNameOnLicense")->item(0)->nodeValue;
            @$tradingName = $operator->getElementsByTagName("TradingName")->item(0)->nodeValue;

            $operatorSQL = "INSERT IGNORE INTO `operator` (`reference`, `national_operator_code`, `operator_code`, `operator_short_name`, `operator_name_on_license`, `trading_name`) VALUES (:reference, :nationalOperatorCode, :operatorCode, :operatorShortName, :operatorNameOnLicense, :tradingName);";

            $operatorStmt = $conn->prepare($operatorSQL);
            $operatorStmt->execute(array(':reference' => $reference, ':nationalOperatorCode' => $nationalOperatorCode, ':operatorCode' => $operatorCode, ':operatorShortName' => $operatorShortName, ':operatorNameOnLicense' => $operatorNameOnLicense, ':tradingName' => $tradingName));
        }
    }
}

上面的 PHP 循环遍历 78,654 个 XML 文件 (1.2gb),解析它们的数据,然后将数据插入 MySQL 数据库。上面的代码片段只是文件的十分之一,但是还有另外 10-15 个 foreach 结构,就像 foreach ($operators) 结构一样。(查看整个文件点击 here )

我的问题是插入 250 个文件的数据需要 10-20 分钟。我需要大幅提高速度,以便在 < 1-2 小时内插入所有数据。

数据库引擎是MySQL,表都是InnoDB。我怎样才能加快这些插入速度?

最佳答案

显然有很多东西要看,但您并没有提供太多细节...

然而,通常可以轻松加速此类大量插入的一件事是:

  1. 删除在插入数据的表上定义的所有索引

  2. 插入数据

  3. 重新创建之前定义的所有索引

这加快速度的原因是索引必须重新组织并且只写入一次,而不是针对每个插入操作。我常常惊讶于这产生了多大的不同......

如果您真的想调整您的 php 实现,那么在示例运行中使用分析器来了解确切的时间花费在哪里是有意义的。专注于那些真正突出的部分。但请记住,将无尽的时间投入到完美主义中是没有意义的。让 CPU 工作比浪费你的时间便宜得多:-)

关于php - 大大加快 MySQL 数据库中 1000 万行的插入速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23031604/

相关文章:

php - Slim 框架给出了一个令人困惑的未捕获类型错误

php - 使用 whereHas 方法的 Laravel Eloquent 查询的奇怪行为

MySQL "inserts"生产环境和本地环境速度差异太大!

c# - 如何将 DataGridView 中的 "True"更改为"is"?

mysql - select 和 insert 中的多个 where 子句

javascript - 在sql和php中插入多个同名的输入文本

php - PHP 操作码缓存基础知识

php - SQL 连接问题返回 NULL 值

php - 如何向3个表中插入数据?

php - 如何在android中将动态数据从一个 Activity 发送到另一个 Activity