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