子查询与mysql中的连接

时间:2015-09-24 04:42:39

标签: mysql sql

为什么要使用join,因为你可以从不同的表中获取数据,比如使用下面的子查询?

enter image description here

2 个答案:

答案 0 :(得分:1)

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

这是关于JOINs vs Subqueries

的好文章
  

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

参见文章中的测试:

enter image description here

  

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

     

方法1:加入我相信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;
     

方法2:子查询在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

答案 1 :(得分:0)

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