【问题标题】:10x performance difference between mysqli_query and bind_param ( PHP 7)mysqli_query 和 bind_param (PHP 7) 之间的 10 倍性能差异
【发布时间】:2017-01-09 13:50:35
【问题描述】:

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

我用过 (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);

?>

结果 = ~ 0.00070500373840332

问题是:为什么会这样?

【问题讨论】:

  • 问题是?
  • 因为连接器必须处理绑定并确定需要引用、转义和清理哪些变量。直接查询是盲插入,因此不需要处理,但对于 SQL 注入也是开放的。那么你想要快速还是安全?
  • 在您的第二个示例中,您没有引用这些值。并且没有关闭连接。
  • @aynber 这是一个很好的答案。谢谢你。但是我想问一下如果 1000 个并发用户尝试向数据库输入内容会发生什么?
  • @aynber 这些变量永远不会被引用、转义和清理,所以你的假设显然是错误的。而且它并没有解释这么大的差异。

标签: php mysql mysqli pdo bindparam


【解决方案1】:

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

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

当然没有像 10x 这样大的差异。在您的情况下,这只是因为由于愚蠢的语法错误,第二个查询永远不会被执行

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

【讨论】:

    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2010-11-21
    • 2012-05-26
    • 2013-09-02
    • 2014-03-15
    • 2010-12-07
    • 2017-06-05
    • 2011-12-03
    相关资源
    最近更新 更多