首頁 >資料庫 >mysql教程 >為什麼 SQL 的 IN 條件有時會比 = 運算子慢?

為什麼 SQL 的 IN 條件有時會比 = 運算子慢?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-16 17:13:08156瀏覽

Why is SQL's `IN` Condition Sometimes Slower Than the `=` Operator?

SQL 的 IN 條件:與 =

相比有效能問題

在特定情況下,與 IN 運算子相比,SQL 的 = 條件的效能可能明顯較差。這是舊 MySQL 版本中的一個值得注意的問題,儘管更高版本(MySQL 5.6 及更高版本)已經解決了這個問題。

效能差異源自於最佳化挑戰。 IN 子句中的子查詢可能會被錯誤地識別為 dependent,而不是 independent。這會導致子查詢重複執行主查詢中的每一行,從而極大地影響效能。

讓我們來看一個例子:

<code class="language-sql">SELECT * FROM question_law_version
WHERE question_law_id IN (
    SELECT MAX(foo_id)
    FROM bar
);</code>

此查詢的EXPLAIN計畫可能會顯示:

<code>1  'PRIMARY'             'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
2  'DEPENDENT SUBQUERY'  'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
3  'DEPENDENT SUBQUERY'  'question_law'          'ALL'  ''  ''  ''  ''  10040  'Using where'</code>

注意「依賴子查詢」指定。 內部查詢會重複執行。 但是,使用 = 重寫查詢(假設子查詢傳回單一值):

<code class="language-sql">SELECT * FROM question_law_version
WHERE question_law_id = (
    SELECT MAX(foo_id)
    FROM bar
);</code>

...通常會產生更有效的計劃:

<code>1  'PRIMARY'   'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
2  'SUBQUERY'  'question_law_version'  'ALL'  ''  ''  ''  ''  10148  'Using where'
3  'SUBQUERY'  'question_law'          'ALL'  ''  ''  ''  ''  10040  'Using where'</code>

關鍵差異在於「SUBQUERY」分類,表示單次執行。這種效能差異是由於 MySQL(在舊版本中)對 IN 子句依賴項的錯誤解釋而引起的。 資料庫對此處理效率低下,導致效能下降。

以上是為什麼 SQL 的 IN 條件有時會比 = 運算子慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn