首頁 > 資料庫 > mysql教程 > 為什麼MySQL子查詢中`IN`比`=`慢?

為什麼MySQL子查詢中`IN`比`=`慢?

Patricia Arquette
發布: 2025-01-16 17:18:12
原創
442 人瀏覽過

Why is `IN` slower than `=` in MySQL subqueries?

MySQL 中 IN 運算子比 = 操作符慢的原因

在某些情況下,MySQL 中 IN 條件的執行速度比 = 條件慢,這是一個已知問題。根本原因在於,MySQL 最佳化器在處理 IN 條件中的子查詢時,有時會錯誤地將其識別為依賴子查詢,而不是獨立子查詢。

因此,IN 條件中的子查詢會為父查詢中的每一行都執行一次,而 = 條件中的子查詢只執行一次。這會導致顯著的效能差異,尤其是在處理大型資料集時。

讓我們來看一個 SELECT 查詢範例:

<code class="language-sql">SELECT *
FROM question_law_version
WHERE law_version 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>
登入後複製

"DEPENDENT SUBQUERY" 行表明,IN 條件中的子查詢正在為父查詢的每一行執行。

如果我們將 IN 條件改為 =

<code class="language-sql">SELECT *
FROM question_law_version
WHERE law_version = (SELECT MAX(foo_id) FROM bar);</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>
登入後複製

"SUBQUERY" 行表明,子查詢現在只執行一次,從而提高了執行速度。

這個問題在 MySQL 5.6.x 版本中已解決。如果可能,升級到較新的 MySQL 版本可以解決此問題並獲得效能提升。

以上是為什麼MySQL子查詢中`IN`比`=`慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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