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