2014-03-14 102 views
0

這兩個查詢有什麼不同嗎?像性能問題等?MySQL嵌套select查詢性能

查詢1:

select i.invoice_id, 
     i.total_price 
    from (select invoice_id, 
       sum(price) as total_price 
      from orders 
     group by 
       invoice_id 
     ) as i 
       inner join invoice 
        ON i.invoice_id = invoice.invoice_id 

查詢2:

select invoice.invoice_id, 
     orders.total_price 
    from invoice 
     inner join (select invoice_id, 
          sum(price) as total_price 
         from orders 
        group by 
          invoice_id 
        ) orders 
      ON orders.invoice_id = invoice.invoice_id 

謝謝!

+0

因爲他們是不同的查詢,所以主持他們的表現是沒有意義的。 –

+0

@HamletHakobyan不,他們不是。 – Alexander

+0

@亞歷山大,你的意思是? –

回答

0

讓我重寫查詢,沒有任何sinifical變化:

查詢1

SELECT i.invoice_id, 
     i.total_price 
    FROM invoice INNER JOIN (
          SELECT invoice_id, 
            sum(price) AS total_price 
          FROM orders 
          GROUP BY 
            invoice_id 
          ) AS i 
        ON i.invoice_id = invoice.invoice_id; 

查詢2:

SELECT invoice.invoice_id, 
     i.total_price 
    FROM invoice INNER JOIN (
          SELECT invoice_id, 
            sum(price) AS total_price 
          FROM orders 
          GROUP BY 
            invoice_id 
          ) AS i 
        ON i.invoice_id = invoice.invoice_id; 

事情我改變:

秩序 JOIN
  • 其沒有按無所謂,因爲它是INNER
  • 表的別名(ordersi,我真不明白,爲什麼你想不同的命名)

現在,很明顯,他們之間的唯一區別 - 在主的第一個參數SELECT。你的問題可能已經發生了(如果一列中有索引而另一列沒有,並且依賴於查詢,你不會總是使用orders.invoice_idinvoice.invoice_id),但是因爲你已經檢索到了兩列INNER JOIN它沒有。

此外,這些查詢是多餘的。正如已經被提及@valex,您的查詢(實際 - 他們兩人的)可以(而且必須)簡化爲這樣:

SELECT invoice_id, 
     sum(price) AS total_price 
    FROM orders 
GROUP BY 
     invoice_id; 

所以,不,存在性能比較沒有differnce。當然,結果集沒有區別。
此外,我希望你知道,你總是可以使用EXPLAIN作爲性能問題。

+1

太棒了!感謝您的答覆。 – basagabi

0

第一個查詢

select i.invoice_id, 
     i.total_price 
    from (select invoice_id, 
       sum(price) as total_price 
      from orders 
     group by 
       invoice_id 
     ) as i 
       inner join invoice 
        ON i.invoice_id = invoice.invoice_id 

是其結果相當於:

select invoice_id, 
    sum(price) as total_price 
from orders 
group by invoice_id 
+0

是嗎?那麼第二個呢? – Alexander

0

要得到相同的結果(如果從orders所有invoice_idinvoice表中存在),你不需要加入Invoice表只是使用查詢:

select invoice_id, 
     sum(price) as total_price 
from orders 
     group by invoice_id