Optimization
優化:JOIN 或 CTE
假設我有這些表和範例數據(我正在處理的真實表有更多列)
表“使用者”
表
區域
表
購買
我應該使用
subquery
,cte
還是join
當這些表有數十億條記錄時(所以效率很重要)和
- 查詢使用者 id=1 居住在哪個城市、州、國家(產生 1 行)
- 通過 price desc limit 100 查詢採購訂單的名稱、城市、價格(獲取前 100 個採購的詳細資訊)。
- 查詢姓名以“博士”開頭的使用者的購買次數、價格總和
- 查詢“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 是否足夠聰明。