首頁 > 資料庫 > mysql教程 > 為什麼即使只有一個值,MySQL 的 IN 運算子也比 = 慢?

為什麼即使只有一個值,MySQL 的 IN 運算子也比 = 慢?

Linda Hamilton
發布: 2025-01-16 17:38:11
原創
1018 人瀏覽過

Why is MySQL's `IN` operator slower than `=` even with a single value?

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 指令檢查查詢計畫可以看出差異:

  • IN 條件:
    • 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where'
    • 'DEPENDENT SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where'
    • 'DEPENDENT SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Using where'
  • 等號條件:
    • 'PRIMARY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where'
    • 'SUBQUERY' 'question_law_version' 'ALL' '' '' '' '' 10148 'Using where'
    • 'SUBQUERY' 'question_law' 'ALL' '' '' '' '' 10040 'Using where'

請注意,使用 = 運算子的查詢計畫中沒有 "DEPENDENT SUBQUERY"。

以上是為什麼即使只有一個值,MySQL 的 IN 運算子也比 = 慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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