mysqli_query和bind_param之间10倍的性能差异(PHP 7)

时间:2016-09-01 15:28:34

标签: php mysql mysqli pdo bindparam

我试图在我的数据库中插入一些东西,我决定用两种不同的方式来查看查询性能。

我用过 (end_microtime - starting_microtime)查看发生了什么的方法。

绑定参数代码:

<?php
timer_start = microtime(TRUE);


$db = @new mysqli('localhost','root','','database');
$username = "username";
$email= "test@html.com";
$password = "123456789";

 $query = "INSERT INTO users (username,email,password) VALUES (?,?,?)";
$stmt = $db->prepare($query);

$stmt->bind_param("sss", $username, $email, $password);
$stmt->execute();

$stmt->close();

$timer_end = microtime(TRUE);  
echo($timer_end - $timer_start);  

?>

结果:~0.090020895004272

mysqli_query代码(我现在更改之前出现语法错误)

<?php
$timer_start = microtime(TRUE);


$db = @new mysqli('localhost','root','','database');
$username = "username";
$email= "asdf@ghj.com";
$password = "123456789";

$query = "INSERT INTO users (username,email,password) 
                   VALUES  ('$username','$email','$password')";
mysqli_query($db,$query);

$timer_end = microtime(TRUE);  
echo($timer_end - $timer_start);

?>

result = ~0.00070500373840332

问题是:为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

普通查询和预准备语句之间的区别总是存在,因为对于后者,您需要两次往返到数据库,一个用于准备查询,另一个用于执行。

但是你不必考虑准备好的语句慢2倍,因为查询执行过程涉及的操作远不止是对服务器的往返,大​​部分是这两种方法都很常见,并且需要花费更多时间(例如,将数据存储在硬盘上)。

当然,没有像10x那样的巨大差异。在您的情况下,仅仅因为第二个查询永远不会被执行,因为语法错误。

关于PDO的结果,这是因为默认情况下PDO只是假的预处理语句,自己处理绑定数据然后发送常规查询。虽然.0002和.0009之间所谓的差异不应该给你留下太多印象,因为它都适合测量错误。