【问题标题】:Subqueries vs join in mysql [duplicate]子查询vs加入mysql [重复]
【发布时间】:2015-12-21 14:15:09
【问题描述】:

为什么要使用连接,因为您可以从不同的表中获取数据,例如使用下面的子查询?

【问题讨论】:

标签: mysql sql


【解决方案1】:

如果您将使用 EXPLAIN,那么您将看到它在使用子查询和使用 JOINS 时的区别。在大多数情况下,JOINS 相对较快。

这是JOINs vs Subqueries上的一篇好文章

在 JOIN 中,RDBMS 可以创建一个更适合您的执行计划 查询并可以预测应该加载哪些数据以进行处理和 节省时间,不像子查询,它将运行所有查询和 加载所有数据以进行处理。

查看文章中进行的测试:

我添加了 100,000 个商家和 150,000 条消息(随机类型 随机业务)。

方法一:JOIN 很长时间以来,我一直认为 JOIN 比子查询快,所以我首先尝试了这种方法。 (注:我必须 设置 SET SQL_BIG_SELECTS=1;只是为了让查询运行……不好 签名!)。

SELECT SQL_NO_CACHE b.id, b.name
FROM `businesses` b
LEFT JOIN `business_messages` bm ON
    b.id = bm.business_id
    AND bm.type = 'action'
WHERE
    bm.type IS NULL
LIMIT 10;

方法二:子查询 in WHERE 这个方法是我表弟发给我的。更容易阅读和理解查询是什么 尝试做:

SELECT SQL_NO_CACHE id, name 
FROM businesses b 
WHERE NOT EXISTS (
    SELECT 1 
    FROM business_messages 
    WHERE business_id = b.id 
        AND type = 'action'
) 
LIMIT 10;

方法3:JOIN中的子查询这是我看到子查询实际操作后的想法:

SELECT SQL_NO_CACHE id, name 
FROM businesses b 
LEFT JOIN (
    SELECT business_id, type 
    FROM business_messages 
    WHERE type = 'action' 
    GROUP BY business_id
) bm 
    ON bm.business_id = b.id 
WHERE bm.type IS NULL 
LIMIT 10;

结果

  Method 1    Method 2    Method 3
1 5.51s   3.91s   0.41s
2 6.60s   4.74s   0.36
3 7.68s   2.40s   0.64s
4 4.23s   2.63s   0.36s
5 6.71s   2.06s   0.30s
6 5.23s   2.01s   0.53s
7 4.03s   2.80s   0.43s
8 4.56s   2.44s   0.55s
9 7.13s   1.95s   0.80s
10    7.04s   1.38s   0.43s
Average   5.872s  2.632s  0.481s

【讨论】:

  • 所以我应该避免子查询?我是 mysql 新手,我的老师在加入之前教过子查询,所以我现在有点困惑。
  • @AliceXu:- 我不会对avoid 说它,但是是的,只要您发现可以使用 JOINS 编写相同的查询,您就可以更喜欢使用 JOINS。
  • 文章直接与你的结论相矛盾。
  • 请注意,在选项 3 中,GROUP BY 在加入之前限制子查询的结果。它将子查询的行数减少到每个业务 1 行,而不是每个消息 1 行。
【解决方案2】:

如果您要使用执行计划,您会看到不同之处。在优化方面,最好使用JOIN,而不是使用子查询,因为子查询可能会花费太多的执行时间,尤其是在处理大量数据时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2011-07-20
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多