2013-04-08 61 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