$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。我怎样才能加快这些插入速度?
最佳答案
显然有很多东西要看,但您并没有提供太多细节...
然而,通常可以轻松加速此类大量插入的一件事是:
删除在插入数据的表上定义的所有索引
插入数据
重新创建之前定义的所有索引
这加快速度的原因是索引必须重新组织并且只写入一次,而不是针对每个插入操作。我常常惊讶于这产生了多大的不同......
如果您真的想调整您的 php 实现,那么在示例运行中使用分析器来了解确切的时间花费在哪里是有意义的。专注于那些真正突出的部分。但请记住,将无尽的时间投入到完美主义中是没有意义的。让 CPU 工作比浪费你的时间便宜得多:-)
关于php - 大大加快 MySQL 数据库中 1000 万行的插入速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23031604/