我正在执行很多准备好的声明。以下是我的代码:
<?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() );
}
?>
上面的这个脚本压缩了所有必要的查询,并以“一次性”将它们发送到数据库。
问题
我们可以做同样的准备陈述吗?这对于能够一次性发送执行语句非常方便,因为准备好的查询在安全性方面更好(如果我使用查询方法,我将不得不手动转义我的参数......)。
显然,这会使查询更快。