2013-04-08 50 views
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 
    
+1

当你尝试时,你观察到了什么? – symcbean 2013-04-08 09:03:42

+0

只是执行查询有一个明显的开销。因此,做小查询会多次发生这种开销。除非你的大型查询非常低效,否则它将比几个小型查询更有效率。用你的例子,这里的差别可能很小,但是它变得非常明显的地方是当你循环一个查询的结果并且为每个结果执行另一个查询时。 – Kickstart 2013-04-08 09:20:02

+0

是的,确切地说。 DB实际上是空的。目前,两者之间几乎没有任何区别。所以,我想知道应该选择哪一个。 – 2013-04-08 09:28:04

回答

6

测量microtime差异;-) 我将尽管与单一查询,少连接,更少的等待时间,它旨在处理这些事情。

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.'; 
?> 
3

其实我对这个有些不同的看法。 MYSQL支持子查询,其中一个原因是将更大的查询分解为更小的查询。如果您正在使用INNODB引擎并且正确使用参数(例如tmp表,堆表,缓冲池或查询缓存),那么您可能会得到更好的结果,然后再进行更小的查询。 MYSQL被设计用来执行很多小的查询,所以最好有更多的小查询,然后是更大的查询。

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

因此,想想看,小型查询会更好,然后一个大的单个查询和开销不是查询它是连接,并且再次MYSQL与连接非常便宜,所以不用担心它们。如果您的MYSQL正在创建线程,那么您无需担心。

总之,少量的查询与巨大的查询将是我的选择。

+0

这是一个有趣的POV。您能否详细说明“MYSQL被设计为执行大量小查询”? – 2013-04-08 12:42:54

+1

确实很多人没有意识到这一点,但是如果你明智地使用你的开发技能并将结果存储在tmp表中,那么小的查询就能做到这一点。正如我所说MYSQL是基于行的,对于更大的集合,您需要移动到列式数据库中。使用MYSQL,您最终需要进行表格分区以获得更快的结果,这再次告诉我们MYSQL像更小的查询。 – 2013-04-08 16:15:25