首页 >数据库 >mysql教程 >MySQL 子查询中的 EXISTS 与 IN:哪个性能更好?

MySQL 子查询中的 EXISTS 与 IN:哪个性能更好?

Patricia Arquette
Patricia Arquette原创
2025-01-03 08:44:39874浏览

EXISTS vs. IN in MySQL Subqueries: Which Performs Better?

MySQL 中 EXISTS 与 IN 的子查询:性能比较

子查询在从数据库中提取特定数据方面发挥着至关重要的作用。两种常见的子查询方法是 EXISTS 和 IN。虽然两者都可以实现相似的结果,但它们表现出不同的性能特征。

考虑以下两个查询:

方法 1:

SELECT *
FROM tracker
WHERE reservation_id IN (
    SELECT reservation_id
    FROM tracker
    GROUP BY reservation_id
    HAVING
        (
            method = 1
            AND type = 0
            AND Count(*) > 1
        )
        OR (
            method = 1
            AND type = 1
            AND Count(*) > 1
        )
        OR (
            method = 2
            AND type = 2
            AND Count(*) > 0
        )
        OR (
            method = 3
            AND type = 0
            AND Count(*) > 0
        )
        OR (
            method = 3
            AND type = 1
            AND Count(*) > 1
        )
        OR (
            method = 3
            AND type = 3
            AND Count(*) > 0
        )
);

方法2:

SELECT *
FROM tracker t
WHERE EXISTS (
    SELECT reservation_id
    FROM tracker t3
    WHERE
        t3.reservation_id = t.reservation_id
    GROUP BY reservation_id
    HAVING
        (
            METHOD = 1
            AND TYPE = 0
            AND COUNT(*) > 1
        )
        OR (
            METHOD = 1
            AND TYPE = 1
            AND COUNT(*) > 1
        )
        OR (
            METHOD = 2
            AND TYPE = 2
            AND COUNT(*) > 0
        )
        OR (
            METHOD = 3
            AND TYPE = 0
            AND COUNT(*) > 0
        )
        OR (
            METHOD = 3
            AND TYPE = 1
            AND COUNT(*) > 1
        )
        OR (
            METHOD = 3
            AND TYPE = 3
            AND COUNT(*) > 0
        )
);

从性能角度来看,方法 2 明显优于方法 1,执行时间不到 1 秒,而执行时间超过 10 秒。要理解这种差异的原因,我们必须深入研究每种方法的内部工作原理。

EXISTS 与 IN:主要差异

  • EXISTS : 检查是否至少有一行与子查询匹配。如果是,则返回true;否则,返回 false。它依赖于行的存在,而不是检索行本身。
  • IN: 将外部查询中的值与子查询中的每行进行比较。如果找到匹配,则返回 true;否则,返回 false。它针对子查询中的所有行执行。

性能注意事项

  • 子查询大小:当子查询返回较大值时行数,IN 与所有行相比可能会变得昂贵。相反,EXISTS 只需要找到一个匹配行,这对于大型子查询来说更加高效。
  • 空值: EXISTS 可以比 IN 更高效地处理空值。当带有 IN 的子查询返回 null 时,它可以将 null 传播到外部查询。但是,EXISTS 将 null 视为 false。
  • 优化: MySQL 可以使用索引来优化 EXISTS,而 IN 可能需要额外的优化,例如使用物化或物化视图。

结论

一般来说,EXISTS是当子查询预计返回大量行或涉及空值时建议使用。对于小型子查询,IN 可以提高性能。始终建议使用解释计划来确定特定查询的最佳方法。

以上是MySQL 子查询中的 EXISTS 与 IN:哪个性能更好?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn