Я выполняю много раз подготовленное заявление. Вот мой код ниже:
<?php
try
{
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$user = 'root';
$password = '';
$options = [];
$pdo = new PDO($dsn, $user, $password, $options);
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO user(name, surname, birthDate) VALUES (:name, :surname, :birthDate)");
for( $i = 0; $i < 1000000; $i++ )
{
$stmt->execute([
':name' => 'Doe',
':surname' => 'John',
':birthDate' => '1970-01-01'
]);
}
$stmt = null;
$pdo->commit();
$pdo = null;
}
catch( Exception $e )
{
die( $e->getMessage() );
}
?>
Этот код зациклится 1 000 000 раз и вставит пользователя в базу данных.
Что я понимаю, так это то, что PDO будет постоянно работать между сервером и базой данных для выполнения этих 1 000 000 выполнений.
Я нахожу это действительно тяжелым, когда дело доходит до тысяч строк. Так что я сделал что-то самостоятельно, используя обычные PDO::query()
метод вместо подготовленного выражения, и вот как это выглядит:
<?php
try
{
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$user = 'root';
$password = '';
$options = [];
$pdo = new PDO($dsn, $user, $password, $options);
$pdo->beginTransaction();
$queries = 'INSERT INTO user(name, surname, birthDate) VALUES ';
for( $i = 0; $i < 1000000; $i++ )
{
$queries .= "('Doe, 'John', '1970-01-01'),";
}
$queries = rtrim( $queries, ',' );
$queries .= ";";
$pdo->query( $queries );
$pdo->commit();
$pdo = null;
}
catch( Exception $e )
{
die( $e->getMessage() );
}
?>
Этот скрипт выше уплотняет все необходимые запросы и отправляет их в базу данных в «один выстрел».
Вопрос
Можем ли мы сделать то же самое, но с готовым заявлением? Это было бы очень удобно, чтобы иметь возможность отправлять выполненные операторы за один раз, так как подготовленный запрос в лучшем случае лучше с точки зрения безопасности (если я использую метод запроса, мне придется вручную экранировать мои параметры …).
Очевидно, это сделает запрос быстрее.
Задача ещё не решена.
Других решений пока нет …