2015-06-03 30 views
2

我有一個如下所示的SQL查詢。MySQL中IN和JOIN的執行順序

SELECT A.a, count(B.id) 
FROM TableA A inner join TableA B on A.referId = B.id 
WHERE A.id in (123,2424,232...) 
GROUP BY A.id 

在執行該查詢

  1. 行被使用where子句,然後再加入執行或執行
  2. 首先加入過濾,然後行過濾?

我在MySQL服務器上運行這個查詢。假設TableA包含百萬行。是否有任何替代和有效的方式來編寫此查詢?

+0

有沒有參考? –

+0

取決於。優化器應該選擇最快的方式,取決於數據量,鍵等。 – jarlh

+0

@MichaelBerkowski,它是一個自加入 –

回答

1

執行順序由查詢規劃器決定。

您可以通過創建索引來影響它。

對於此查詢,我建議將COUNT(b.ID)更改爲COUNT(*)。我還建議在(id, referId)上創建compound index。這應該提供coverage從您的表的第一個實例所需的東西。

有關查詢性能的更多信息,這是一個很好的資源。 http://planet.mysql.com/entry/?id=661727

0

由查詢選擇的行首先由FROM子句連接條件,然後是WHERE子句搜索條件,然後是HAVING子句搜索條件進行過濾。可以在FROM或WHERE子句中指定內連接,而不影響最終結果。