2013-01-04 83 views
2

在我的應用程序中,我有兩個MySQL表,'units'和'impressions'相對於許多關係。我需要從單位表中獲取所有廣告單元的列表,同時獲取每個廣告單元的展示次數。MySQL:在列表中使用GROUP BY和子查詢

我有兩個SELECT查詢做這個任務(簡化這個例子),先用子選擇:

SELECT 
    (SELECT COUNT(*) FROM impressions WHERE impression_unit_id = unit_id) AS impressions_count, 
    unit_id 
FROM units; 

和第二使用GROUP BY:

SELECT 
    COUNT(impression_id) AS impressions_count, 
    unit_id 
FROM units 
LEFT JOIN impressions ON impression_unit_id = unit_id 
GROUP BY unit_id; 

子選擇查詢爲每個記錄(廣告單元)運行,因此GROUP BY看起來更聰明,但它有一個JOIN更多。哪一個更喜歡錶現?

+0

嘗試一下,看看它們是如何執行的......我期望數據庫能爲這兩個查詢提出相同的執行計劃,所以我期望它們在性能方面是相同的。 。但是,爲了美觀的原因,我會重新編寫第二個查詢來使用「left join」而不是「right join」。 –

+0

Michael你是對的我編輯過使用LEFT JOIN指出「主」表。 – Marko

回答

1

GROUP BY查詢會執行得更好。查詢優化器可能會優化第一個查詢以使用連接,但我不會指望它,因爲它被編寫爲使用從屬子查詢,這會比較慢。只要表格正確編制索引,JOIN就不應該是性能的主要問題。

第一個查詢,如果沒有得到優化以使用JOIN將不得不爲單位表中的每一行運行子查詢,其中JOIN查詢在一個操作中完成所有操作。

要了解如何優化查詢,請運行兩個查詢的EXPLAIN。如果第一個使用從屬子查詢,它將會變慢。

+0

解釋提到第一個依賴子查詢,我想我應該堅持GROUP BY,謝謝! – Marko