5

以下哪种方法更有效:

  1. 单个更长的查询:

    "SELECT COUNT( * ) AS num
    FROM (
    
        SELECT users.UID, cnumber
        FROM users
        JOIN identity ON users.UID = identity.UID
        WHERE  'abc'
        IN (google, facebook, twitter, linkedin)
    
    ) AS userfound
    JOIN jobs ON userfound.cnumber = jobs.cnumber
    WHERE JID = 24";
    
    
    if(resultfromquery == 1)
        //Some code here
    else
        //Some code here
    
  2. 将较长的查询分解为多个单表查询:

    uid = "SELECT UID FROM identity WHERE 'abc' IN (google, facebook, twitter, linkedin)";
    cnumber_from_usertable = "SELECT cnumber FROM users WHERE UID = 'uid'";
    cnumber_from_jobtable = "SELECT cnumber FROM jobs WHERE JID = 24";
    
    if(cnumber_from_usertable == cnumber_from_jobtable)
        //Some code here
    else
        //Some code here
    
4

2 回答 2

8

测量微时差 ;-) 不过,我会使用单个查询,更少的连接,更少的等待时间,它旨在处理这些事情。

http://www.phpjabbers.com/measuring-php-page-load-time-php17.html

<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>
"SELECT COUNT( * ) AS
FROM (

    SELECT users.UID, cnumber
    FROM users
    JOIN identity ON users.UID = identity.UID
    WHERE  'abc'
    IN (google, facebook, twitter, linkedin)

) AS userfound
JOIN jobs ON userfound.cnumber = jobs.cnumber
WHERE JID = 24";


if(resultfromquery == 1)
    //Some code here
else
    //Some code here

<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';
?>
于 2013-04-08T09:04:20.273 回答
5

其实我对此有些不同的看法。MYSQL 支持子查询,其中一个原因是将较大的查询分解为较小的查询。如果您正在使用 INNODB 引擎并且正确使用参数,例如 tmp 表、堆表、缓冲池或查询缓存,那么您可能会获得比较小查询更好的结果。MYSQL 旨在执行大量小查询,因此最好有更多的小查询而不是更大的查询。

如果更大的查询是更好的选择,那么我们不需要创建像 Infinidb 和 INfobright 这样使用基于列的结构来运行大型查询的工具,而 MYSQL 是基于行的。

所以想一想,小查询的结果会比一个大的单个查询更好,而且开销不是查询,而是连接,而且 MYSQL 的连接非常便宜,所以也不用担心它们。但是,如果您的 MYSQL 正在创建线程,那么您无需担心。

简而言之,小型查询与大型大型查询将是我的选择。

于 2013-04-08T09:57:07.737 回答