我试图向数据库中插入一些内容,并决定使用两种不同的方式来查看查询性能。
我用过 (end_microtime -starting_microtime) 方式查看正在发生的情况。
绑定(bind)参数代码:
<?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);
?>
结果 = ~ 0.00070500373840332
问题是:为什么会发生这种情况?
最佳答案
普通查询和准备好的语句之间的差异始终存在,因为对于后者,您需要两次到数据库,一次准备查询,一次执行。
但是,您不必认为准备好的语句会慢 2 倍,因为查询执行过程涉及的操作远多于服务器的往返操作,其中大部分是这两种方法都很常见,并且需要更多时间(例如将数据存储在硬盘上)。
当然,没有像 10 倍那么大的差异。在您的情况下,这只是因为由于愚蠢的语法错误,第二个查询永远不会被执行。
关于 PDO 的结果,这是因为默认情况下 PDO 只是伪造准备好的语句,自行处理绑定(bind)数据,然后发送常规查询。尽管 .0002 和 .0009 之间所谓的任何差异都不应该给您留下太深的印象,因为它们都适合测量误差。
关于php - mysqli_query 和 bind_param 之间性能差异 10 倍(PHP 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275574/