首頁 >資料庫 >mysql教程 >為什麼在 MySQL 查詢中,即使只有一個值,`IN` 也比 `=` 慢?

為什麼在 MySQL 查詢中,即使只有一個值,`IN` 也比 `=` 慢?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-16 17:06:13382瀏覽

Why is `IN` slower than `=` in MySQL queries, even with a single value?

MySQL 的 IN= 效能差異

問題:使用 IN 運算子的 MySQL 查詢可能比使用 = 運算子的查詢慢得多,即使 IN 與單一值進行比較也是如此。

根本原因: 問題在於 MySQL 如何處理 IN 子句中的子查詢。舊版(5.6 之前)經常將這些子查詢錯誤地識別為依賴子查詢。

依賴子查詢與獨立子查詢: 對外部查詢中的 行重新執行依賴子查詢,從而導致顯著的效能開銷。 獨立子查詢只執行一次。 MySQL 的早期版本錯誤地將 IN 子查詢視為依賴子查詢,即使它們傳回單一值也是如此。

解釋分析: EXPLAIN 指令揭示了此行為。 帶有子查詢的 IN 查詢在執行計劃中顯示“DEPENDENT SUBQUERY”,而使用 = 的等效查詢則顯示“SUBQUERY”。

範例 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>

EXPLAIN 輸出範例(使用 = 修正問題後):

<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>

範例:

這個簡單的查詢示範了問題:

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

即使子查詢傳回單一值,它也會被視為依賴,從而導致執行速度緩慢。 將 IN 替換為 = 可以顯著提高效能。

解:

MySQL 5.6及更高版本中解決了效能問題。 升級到新版本可以解決此差異。 如果升級不可行,可以使用子查詢(例如使用聯結)重寫查詢來避免 IN

以上是為什麼在 MySQL 查詢中,即使只有一個值,`IN` 也比 `=` 慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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