如何使用PHP有效地将数百万个数据集插入MySQL数据库?

时间:2013-05-21 14:54:59

标签: php mysql performance insert

我运行一个PHP脚本,从文件中读取数据行,分析它们并将它们逐个插入到本地MySQL数据库中:

$mysqli = new mysqli($db_host, $db_user, $db_password, $db_db);
if ($mysqli->connect_errno) {
  echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
} else {
  /* As long as there is data in the file */
  while(...) {
    ... // analyse each row (contained in an object $data)
    /* Write it to the database table. */
    $mysqli->query($data->getInsertQuery($db_table));
  }
}

我有4000万个数据行。前几百万个数据集的插入速度非常快,但在过去的6个小时内只插入了两百万个(我现在已经达到了3000万个),而且它似乎变得越来越慢(到目前为止,还没有定义索引! )。

我想知道,如果这是一种更有效的方式将数据写入表中。如果可能的话,我更喜欢没有额外(临时)文件的解决方案。

3 个答案:

答案 0 :(得分:2)

首先将文件转换为SQL文件(如此简单地更改脚本以将语句写入文件)然后使用mysql命令行加载它会更高效:

mysql -uuser -p dbname < file.sql

通过如此大的导入,它将为您节省大量使用PHP带来的开销。只需记住一次将数据流式传输到文件中一个查询;)

答案 1 :(得分:1)

可以将SQL插入命令预生成并存储到文件中,然后将数据导入MySQL。

mysql --default-character=utf8 --user=your_user -p your_db < tbl.sql

答案 2 :(得分:0)

您可以使用预准备语句加快速度:

请参阅http://devzone.zend.com/239/ext-mysqli-part-i_overview-and-prepared-statements/我发现谷歌搜索“stackoverflow mysqli prepared statements”