这是我运行的一个简单测试,以快速了解使用 MySQL PDO 准备好的语句与使用直接查询所付出的性能损失。person 表中有 2801 行。MySQL 版本 5.5.28 和 PHP 版本 5.3.15。香草安装,无论默认参数是什么。测试在 8GB 的 iMac 上运行。
$pdo = new PDO('mysql:host=localhost;dbname=cwadb_local', 'root', "");
$start = microtime(true);
for ($i = 0; $i < 200; $i++) {
$pdo->query("select * from person where name_last = 'smith' or true");
}
echo "<p>query: " . (microtime(true) - $start);
$start = microtime(true);
for ($i = 0; $i < 200; $i++) {
$stmt = $pdo->prepare("select * from person where name_last = :last or true");
$stmt->execute(array('last' => 'smith'));
}
echo "<p>prepare/execute: " . (microtime(true) - $start);
这是输出:
query: 21.010436058044
prepare/execute: 20.74036192894
这根本没有任何惩罚。可能性:
缓存准备好的语句确实有效。(请注意,我将准备函数保留在循环中。)
这是一个虚假的测试,因为它太简单了。
没有理论上的理由为什么准备/执行应该更慢,而且,厌倦了不断的批评,MySQL/PDO/PHP 开发人员加倍努力使它们更快,试图让我们所有人闭嘴。
其他?
这里已经多次说过,使用准备好的语句比使用查询更安全,并且使用 PDO 中的命名参数(Mysqli 没有它们),处理参数非常方便。但是,正如经常注意到的那样,如果每次执行时都必须准备语句,则会降低性能。
那么,有人可以提供一些与我的简单测试相矛盾的测试吗?或者,我们现在是否应该承认没有理由不使用准备好的语句?