2017-07-14 76 views
0

我有兩個SQL的,給了我同樣的結果:子查詢與加入和哪裏 - 哪一個更快?

查詢1:

SELECT 
u.*, COUNT(po.order_id) products_count 
FROM (SELECT * FROM orders o WHERE o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH)) o 
LEFT JOIN products_orders po ON po.order_id=o.id 
JOIN users u ON u.id=o.user_id 
GROUP BY po.order_id 

和查詢2:

SELECT 
u.*, o.id order_id, COUNT(po.order_id) products_count 
FROM users u 
JOIN orders o ON o.user_id=u.id 
LEFT JOIN products_orders po ON po.order_id=o.id 
WHERE o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH) 
GROUP BY po.order_id 

我不知道..這應該是更快? 查詢說明顯示他們是平等的......你認爲什麼人? Query 1 Query 2

+0

如果解釋計劃是相同的,那麼表現應該是相同的。記住基於成本的優化器可以用你的SQL「小提琴」來獲得最好的結果(至少它在正確性和性能方面認爲是最好的) – xQbert

+0

請不要交叉發帖:https:// dba .stackexchange.com/questions/179878/subquery-vs-join-and-where-which-one-is-faster –

+0

已投票刪除 – breq

回答

0

查詢是不是你選擇不同的列完全相同
你可以直接在條款上避免地方
應該更快withou子選擇查詢添加WHERE條件..因爲不需要用於存儲臨時表子查詢

SELECT 
     u.* 
     , o.id order_id 
     , COUNT(po.order_id) products_count 
    FROM users u 
    INNER JOIN orders o ON o.user_id=u.id 
      and o.date >= (CURRENT_DATE() - INTERVAL 1 MONTH) 
    LEFT JOIN products_orders po ON po.order_id=o.id 
    GROUP BY po.order_id 

檢查避免其中使用上

0

通常j中的結果OIN比子查詢更有效率,並反映在EXPLAIN輸出內。這是因爲使用子查詢需要虛擬表格,然後使用該表格進行查詢。在現有表上使用JOIN將跳過此步驟,並允許優化器利用索引或緩存數據的形式瞭解此表。

您的EXPLAIN在這裏相同的可能原因是因爲您的子查詢有多簡單。由於您只是使用where條件進行全選,優化程序通常會注意到這一點,並解析表中的子查詢和JOIN,並在稍後應用WHERE。因此,優化器在執行之前會有效地將您的子查詢版本重寫爲JOIN版本。