為什麼在 MySQL 中在 WHERE 子句中使用子查詢那麼慢?

Mary-Kate Olsen
發布: 2024-11-22 16:09:11
原創
627 人瀏覽過

Why Is Using a Subquery in the WHERE Clause So Slow in MySQL?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板