Optimization

優化:JOIN 或 CTE

  • June 2, 2022

假設我有這些表和範例數據(我正在處理的真實表有更多列)

表“使用者”

區域

購買

我應該使用subquerycte還是join當這些表有數十億條記錄時(所以效率很重要)和

  1. 查詢使用者 id=1 居住在哪個城市、州、國家(產生 1 行)
  2. 通過 price desc limit 100 查詢採購訂單的名稱、城市、價格(獲取前 100 個採購的詳細資訊)。
  3. 查詢姓名以“博士”開頭的使用者的購買次數、價格總和
  4. 查詢“c”國各城市使用者平均消費(總價)

我會說總是以加入為目標。

如果這不可能,請考慮子查詢或 CTE。

這就是為什麼

查詢順序處理是:FROM、WHERE、GROUP BY、SELECT… 越早縮小結果越好,因為下一個處理的子句要做的事情會更少。

像這樣使用連接: SELECT … FROM users u JOIN purchase p ON u.id=p.id … 將縮小第一個處理子句的結果 - FROM 子句。它只會返回滿足連接條件的記錄。在這個例子中,只有至少有一次購買的使用者。

在 WHERE 子句中,您可以進一步縮小範圍。例如 WHERE users.name like ‘Dr%’ 或 WHERE region.country=‘c’

接下來是 GROUP BY、ORDER BY 和 FETCH。例如… ORDER BY purchase.price 僅獲取下 100 行

優化器是一款複雜的軟體。有時它可以將 CTE 或子查詢中的查詢重寫為連接。我不知道 MySQL 是否足夠聰明。

引用自:https://dba.stackexchange.com/questions/312845