如何使用php脚本向MySQL数据库插入百万行?

时间:2019-04-23 20:56:28

标签: php mysql insert rows

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

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

这是我尝试过的一段代码,但由于耗尽了允许的内存大小而无法正常工作。

P.S。不能更改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);

1 个答案:

答案 0 :(得分: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万个-上面的代码不会处理最后一个大小不相同的批次(请考虑将其修正为练习)。