Как вставить миллион строк в базу данных MySQL, используя скрипт php? - PullRequest
1 голос
/ 23 апреля 2019

Я ищу php-скрипт для генерации случайных данных и вставки 1 миллиона строк в базу данных 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 Ответ

1 голос
/ 24 апреля 2019

Делайте это партиями, например, 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);
}

Возможно, вам потребуется увеличить параметр max_allowed_packet сервера MySQL для обработки 1000 строк или уменьшить размер пакета. Убедитесь, что $batch_size равномерно делится на 1 миллион - приведенный выше код не обрабатывает последнюю партию не того же размера (рассмотрите возможность исправить это как упражнение для читателя).

...