【问题标题】:How to efficiently insert millions of datasets to a MySQL database using PHP? [duplicate]如何使用 PHP 高效地将数百万个数据集插入 MySQL 数据库? [复制]
【发布时间】:2013-05-21 14:54:59
【问题描述】:

我运行一个 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 小时内只插入了 200 万个(我现在是 3000 万个),而且似乎越来越慢(到目前为止,还没有定义索引! )。

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

【问题讨论】:

  • 你考虑过使用LOAD DATA INFILE吗?必须对每一行执行什么类型的分析?
  • 听起来更像是 PHP 的 MySQL 优化问题。您还可以尝试通过将多个插入分组为 1 个扩展插入来减少插入次数,例如INSERT INTO `table_name` (`col1`,`col2`) VALUES ('value1', 'value2'), ('value3', 'value4'), ('value5',....)
  • 不确定这是否像在 Oracle 中一样适用于 MySQL,但每隔几百或几千行一个 COMMIT 可能会有所帮助。数百万未提交的行可能会减慢速度。
  • 您是否在使用 InnoDB,如果是 - 您是否配置了 MySQL 实例?我之所以问,是因为我时不时地进行 1 亿行插入,并且它并没有像它为你做的那样减慢。听起来您是在默认设置下运行并启用自动提交(每个查询都在自己的事务中)。
  • 我会给最后 2 个 cmets 和 STT LCU 的评论一个被接受为答案的机会。这 3 个答案确实添加了尚未添加到提到的“重复”的新内容。

标签: php mysql performance insert


【解决方案1】:

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

mysql -uuser -p dbname < file.sql

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

【讨论】:

  • 另外,将输入包装在事务中。这将大大加快速度。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以使用准备好的语句来加快速度:

    查看http://devzone.zend.com/239/ext-mysqli-part-i_overview-and-prepared-statements/,我在谷歌上搜索“stackoverflow mysqli 准备好的语句”

    【讨论】:

    • 准备好的语句如何加快速度?
    猜你喜欢
    • 2019-09-13
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多