首页 > 数据库 > mysql教程 > 为什么 INNER JOIN 中的 OR 条件会导致性能损失?

为什么 INNER JOIN 中的 OR 条件会导致性能损失?

Mary-Kate Olsen
发布: 2025-01-10 18:47:43
原创
964 人浏览过

Why Does an OR Condition in an INNER JOIN Cause a Performance Penalty?

数据库优化:INNER JOIN 中 OR 条件的性能影响

数据库查询优化中,理解 JOIN 语句中不同条件的影响至关重要。其中一个常见问题是 INNER JOIN 中使用 OR 条件。

考虑以下查询:

<code class="language-sql">SELECT mt.ID, mt.ParentID, ot.MasterID
FROM dbo.MainTable AS mt
INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID
                                  OR ot.ID = mt.ParentID</code>
登录后复制

这个查询最初执行需要数分钟。仔细检查后,问题被确定为 INNER JOIN 中的 OR 条件。

为了解决这个问题,查询被重写为使用一对 LEFT JOIN:

<code class="language-sql">SELECT mt.ID, mt.ParentID,
   CASE WHEN ot1.MasterID IS NOT NULL THEN
      ot1.MasterID ELSE
      ot2.MasterID END AS MasterID
FROM dbo.MainTable AS mt
LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID
LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID
WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL</code>
登录后复制

优化后的查询现在大约一秒钟内完成执行。

在 INNER JOIN 中使用 OR 条件会严重影响查询性能,原因如下:

  • 它阻止优化器使用更高效的连接算法,例如 HASH JOIN 或 MERGE JOIN。
  • 它迫使优化器生成笛卡尔积,对于大型表来说,这在计算上代价很高。

因此,最好使用连接结果集来表达此类条件。在上面的示例中,这将转换为:

<code class="language-sql">SELECT  *
FROM    maintable m
JOIN    othertable o
ON      o.parentId = m.id
UNION ALL
SELECT  *
FROM    maintable m
JOIN    othertable o
ON      o.id = m.parentId</code>
登录后复制

通过使用等值连接 (equijoins) 并连接结果,查询优化器可以高效地执行操作,而不会产生性能损失。 注意这里使用了UNION ALL,如果需要去除重复行则使用UNION

以上是为什么 INNER JOIN 中的 OR 条件会导致性能损失?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板