2011-05-01 52 views
2

我想知道對於簡單的事情,性能和編程風格更好:從一個表中獲取2個值的計數(以下所有查詢都執行相同的工作)。從2個WHERE條件中的一個表中計算值

製作2單查詢:

SELECT count(*) FROM `a` WHERE categories_id=2 
SELECT count(*) FROM `a` WHERE group_id=92 

,或者使用子查詢

SELECT (SELECT count(*) FROM `a` WHERE categories_id=2 AS categories) 
,(SELECT count(*) FROM `a` WHERE group_id=92) AS groups) 

或工會

SELECT count(*) FROM `a` WHERE categories_id=2 
UNION 
SELECT count(*) FROM `a` WHERE group_id=92 

回答

1

三者之間的主要區別在於處理結果值,儘管這不是創傷。

  1. 第一個示例在兩個單獨的提取操作中(在單獨的語句上)返回兩個值。
  2. 第二個示例將這兩個值作爲單個提取操作的一部分進行返回。
  3. 第三個示例在兩個單獨的提取操作中(在同一語句上)返回兩個值。

性能方面,只有兩行數據,三者之間的選擇很少。第二個(兩個子查詢)解決方案用單個語句做的最多,並且只需要一次獲取操作,所以它可能是最快的。第一個需要單獨解析兩個語句,再加上兩組操作,所以它應該是最慢的。但是否能夠真正衡量這一點取決於很多因素。如果客戶端在澳大利亞而服務器在歐洲,那麼往返延遲可能意味着第二個或第三個解決方案是最好的(並且差異可能取決於DBMS是否用單個客戶端 - 服務器返回多個行消息交換)。如果客戶端與服務器在同一臺機器上,那麼往返延遲就不那麼重要了。

爲了便於理解,UNION版本可能足夠乾淨;它不會讓讀者感到困惑。第一個版本可能稍微更清潔(少一個關鍵字),但差異很小。

如果勝清晰的替代品的增加(超過group_id值,或一個以上的categories_value),那麼我認爲聯盟號:

SELECT 'G' AS type, group_id, COUNT(*) 
    FROM a 
WHERE group_id IN (92, 104, 137, 291) 
GROUP BY type, group_id 
UNION 
SELECT 'C' AS type, categories_id, COUNT(*) 
    FROM a 
WHERE categories_id IN (2, 3, 13, 17, 19, 21) 
GROUP BY type, categories_id 

的「類型」列允許您區分一個組ID和一個共享相同ID號的類別ID(儘管它們是兩種不同的ID)。因爲它更容易擴展,除非在實時數據上有令人信服的時間實驗來顯示選項2(子查詢)事實上更快,否則我可能會使用選項3(UNION)。

0

第一個選擇,做兩間進行選擇,將永遠爲小幅低效率它涉及到數據庫的額外往返。在後兩者之間,聯盟版本在理論上會比聯盟會導致數據庫必須對值進行排序並進行聯合稍慢。在實踐中,只有兩個值,對於查詢的兩個主要部分來說,這是不可測量的。

+0

使用'UNION ALL'將刪除「排序」步驟。 – 2011-05-01 21:28:48

相關問題