MySQL 效能影響:WHERE 子句中的子查詢
處理重複資料時,有必要識別和檢查有問題的行。但是,在 WHERE 子句中使用子查詢的簡單查詢可能會遇到嚴重的效能問題。
原始查詢:
SELECT * FROM some_table WHERE relevant_field IN ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 )
儘管有相關欄位上的索引,但這查詢執行速度異常緩慢。原因在於子查詢的相關性質。
相關子查詢和效能:
相關子查詢是引用外部查詢中的列的查詢。在這種情況下,子查詢選擇表中多次出現的 related_field 值。對於外部查詢中的每一行,都會執行子查詢,從而導致相同查詢的多次執行。這會導致效能不佳。
非相關子查詢作為解決方案:
為了消除效能問題,建議將相關子查詢轉換為非相關子查詢一。這可以透過從子查詢中選擇所有列並為其指派別名來實現。
SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery
修改後的查詢:
SELECT * FROM some_table WHERE relevant_field IN ( SELECT * FROM ( SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1 ) AS subquery )
此查詢執行速度更快因為子查詢不再相關。它計算在單一執行中多次出現的 related_field 值,並將它們儲存在子查詢別名中,然後在主查詢中使用該別名。
結論:
了解相關子查詢和非相關子查詢之間的差異對於最佳化 MySQL 效能至關重要。透過將相關子查詢轉換為非相關子查詢,可以顯著提高依賴 WHERE 子句中子查詢的查詢速度。
以上是為什麼在 MySQL 中在 WHERE 子句中使用子查詢那麼慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!