【问题标题】:How to insert million rows into MySQL database using php script?如何使用 php 脚本将百万行插入 MySQL 数据库?
【发布时间】:2019-09-13 02:49:15
【问题描述】:

我正在寻找 php 脚本来生成随机数据并将 100 万行插入到 mysql 数据库中。

这是我在作业中收到的一个测试用例。

这是我尝试过的一段代码,但由于允许的内存大小耗尽,它没有工作。

附:不能更改 memory_limit,因为它被禁止并被视为作弊:)

$query = "INSERT INTO book(firstname, lastname, phone_number, address) VALUES ";
   $query_parts = array();
   for($i=0; $i<1000000; $i++){
     $firstname = 'name' . $i;
     $lastname = 'lastname' . $i;
     $phone_number = mt_rand();
     $address = 'address' . mt_rand();
     $query_parts[] = "('" . $firstname . "', '" . $lastname . "', '" . $phone_number . "', '" . $address . "')";
   }
   $query .= implode(',', $query_parts);

   $create_record_query = mysqli_query($connection, $query);

【问题讨论】:

  • 奇怪,谁给你这样的条件?
  • 一次做一千个。您还需要考虑 MySQL max_allowed_packet 设置。
  • 能否将数据写入文件,然后使用LOAD DATA INFILE
  • 您需要将数据分块成更小的请求并进行处理。这在处理大量数据时实际上很常见。 @Barmar 如果允许,我同意这绝对是最好的解决方案。
  • 可以用PDO代替mysqli吗?使用数千个? 创建 PDO 准备语句并将所有值放入数组中更容易。

标签: php mysql insert rows


【解决方案1】:

分批进行,例如一次 1000 行。

使用 PDO 而不是 mysqli,因为它允许您使用数组执行准备好的语句来提供值。

$batch_size = 1000;

$sql = "INSERT INTO book(firstname, lastname, phone_number, address) VALUES ";
// Add 1,000 value lists
$sql .= str_repeat("(?,?,?,?),", $batch_size-1);
$sql .= "(?,?,?,?)";
$stmt = $pdo->prepare($sql);
for ($i = 0; $i < (1000000/$batch_size); $i++) {
    $vals = array();
    for ($j = 0; $j < $batch_size; $j++) {
        array_push($vals, "name$j", "address$j", mt_rand(), "address" . mt_rand());
    }
    $stmt->execute($vals);
}

您可能需要增加 MySQL 服务器的 max_allowed_packet 设置以处理 1000 行,或减少批处理大小。确保 $batch_size 均匀地分成 100 万 - 上面的代码不能处理大小不同的最后一批(考虑将其修复为读者的练习)。

【讨论】:

  • $sql .= "(?,?,?,?),";应该是 $sql .= "(?,?,?,?)";
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多