MySQL 效能難題:子查詢效能異常
當嘗試從資料庫擷取重複記錄時,SQL 查詢利用子查詢來辨識相關行表現出令人驚訝的性能差異。
初始查詢透過對特定欄位進行分組和篩選來有效隔離重複記錄,執行速度很快。然而,隨後的查詢試圖檢索其值與重複集中的值相符的所有行(使用 WHERE ... IN(子查詢)構造實現)變得異常緩慢。
儘管存在索引相關領域,執行需要幾分鐘才能完成。由於懷疑資料庫限制,從子查詢建立了一個視圖,並修改了父查詢以引用該視圖。這導致了近乎瞬時的執行。
揭開罪魁禍首:相關查詢問題
經過調查,發現效能緩慢源自於查詢的相關性質子查詢。在相關子查詢中,內層查詢引用了外層查詢的某個字段,導致外層查詢中的每一行都執行多次子查詢,導致效率降低。
解決瓶頸:隔離子查詢
為了減輕效能損失,透過從子查詢中選擇所有欄位並為其指派別名,將相關子查詢轉換為非相關子查詢。這保證了子查詢只執行一次,顯著提高了查詢效能。
修改後的父查詢,現在引用不相關的子查詢結果,以期望的效率執行,解決了效能問題。
以上是為什麼我的 WHERE IN(子查詢)查詢很慢,但從子查詢參考視圖卻很快?的詳細內容。更多資訊請關注PHP中文網其他相關文章!