MySQL 查詢效能異常:IN 運算子與等號運算子的效能差異
問題描述
在 MySQL 中,使用 IN 條件的 SELECT 查詢語句效能明顯低於使用等號 (=) 運算子的相同查詢語句。即使 IN 條件只包含單一值,效能差異也可能很大。
解釋
這個問題源自於 MySQL 中的一個最佳化缺陷,該缺陷在 MySQL 5.6.x 版本中已修復。當包含 IN 條件的子查詢被錯誤地分類為依賴子查詢而不是獨立子查詢時,就會出現此問題。
依賴子查詢與獨立子查詢
範例查詢分析
以下範例查詢示範了這種異常情況:
<code class="language-sql">SELECT * FROM question_law_version WHERE id IN ( SELECT MAX(foo_id) FROM bar )</code>
執行此查詢時,子查詢被視為依賴子查詢,導致效能低下。但是,將 IN 替換為 = 可以消除依賴性,並顯著提高效能。
查詢計畫比較
使用 EXPLAIN 指令檢查查詢計畫可以看出差異:
請注意,使用 = 運算子的查詢計畫中沒有 "DEPENDENT SUBQUERY"。
以上是為什麼即使只有一個值,MySQL 的 IN 運算子也比 = 慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!