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