pdo准备并执行“一枪”?

时间:2017-03-21 11:48:28

标签: php pdo prepared-statement query-performance

我正在执行很多准备好的声明。以下是我的代码:

<?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() );
    }
?>

上面的这个脚本压缩了所有必要的查询,并以“一次性”将它们发送到数据库。

问题

我们可以做同样的准备陈述吗?这对于能够一次性发送执行语句非常方便,因为准备好的查询在安全性方面更好(如果我使用查询方法,我将不得不手动转义我的参数......)。

显然,这会使查询更快。

0 个答案:

没有答案