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