两者之间的差异,在速度/性能方面是什么?
$sql = "SELECT * "
. "FROM `myTable` "
. "WHERE `id` = 4";
$sql = "SELECT *
FROM `myTable`
WHERE `id` = 4";
答案 0 :(得分:6)
可能是一个非常非常非常小的差异,第一个可能有点慢(因为连接) ......
...但是执行单个简单SQL查询所花费的时间将是数千(可能是数百个,只需一个简单的查询 - 只是一个疯狂的猜测,但你会明白这一点)时间比那个非常小的差异更重要!
所以,你真的不应该为这种“优化”而烦恼,并考虑/选择最容易写/读/理解和维护的东西。
编辑:只是为了好玩,以下是为代码的第一部分生成的操作码:
$ php -dextension=vld.so -dvld.active=1 temp-2.php
Branch analysis from position: 0
Return found
filename: /home/squale/developpement/tests/temp/temp-2.php
function name: (null)
number of ops: 6
compiled vars: !0 = $sql
line # op fetch ext return operands
-------------------------------------------------------------------------------
5 0 EXT_STMT
1 CONCAT ~0 'SELECT+%2A+', 'FROM+%60myTable%60+'
2 CONCAT ~1 ~0, 'WHERE+%60id%60+%3D+4'
3 ASSIGN !0, ~1
8 4 RETURN 1
5* ZEND_HANDLE_EXCEPTION
而且,对于第二个:
$ php -dextension=vld.so -dvld.active=1 temp-2.php
Branch analysis from position: 0
Return found
filename: /home/squale/developpement/tests/temp/temp-2.php
function name: (null)
number of ops: 4
compiled vars: !0 = $sql
line # op fetch ext return operands
-------------------------------------------------------------------------------
7 0 EXT_STMT
1 ASSIGN !0, 'SELECT+%2A%0A++++++++FROM+%60myTable%60%0A++++++++WHERE+%60id%60+%3D+4'
9 2 RETURN 1
3* ZEND_HANDLE_EXCEPTION
所以,是的,有一点不同......但是,我之前所说的仍然是真的:你不应该关心那种优化:你会做很多“未优化”的东西您的应用程序的其他部分(或者即使您的服务器的配置)这样的小差异意味着绝对没有什么
嗯,除非你是谷歌并拥有数千台服务器,我猜^^
答案 1 :(得分:2)
要测试这种东西,你可以使用一个很长的循环并反复运行代码进行比较。这样做两次(或更多)来比较操作。运行几十次并跟踪结果。
ob_start();
$t = microtime(true);
while($i < 1000) {
// CODE YOU WANT TO TEST
++$i;
}
$tmp = microtime(true) - $t;
ob_end_clean();
echo $tmp
答案 2 :(得分:0)
我认为后者更快。因为您在前者中使用了连接运算符,解析它可能需要一些时间。
答案 3 :(得分:0)
我认为第一个可能因为连接而需要更长的时间,但是,它并没有多大区别。如果您担心优化,可以先在数据库中使用存储过程,而不是在PHP代码中编写SQL。这不仅会提高速度,还会提高安全性。