Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql中的子查询与连接_Mysql_Sql - Fatal编程技术网

mysql中的子查询与连接

mysql中的子查询与连接,mysql,sql,Mysql,Sql,既然可以像使用下面的子查询一样从不同的表中获取数据,为什么要使用join 如果您使用EXPLAIN,那么您将看到它在使用子查询和连接时所起的作用。在大多数情况下,联接相对较快 这里有一篇关于这个问题的好文章 在连接中,RDBMS可以创建一个更适合您的执行计划 查询并可以预测应加载哪些数据以进行处理和 节省时间,与子查询不同,子查询将运行所有查询和 加载所有数据以进行处理 请参阅本文中执行的测试: 我添加了100000个业务和150000条消息(随机类型 随机业务) 方法1:JOIN我一直认为连

既然可以像使用下面的子查询一样从不同的表中获取数据,为什么要使用join


如果您使用EXPLAIN,那么您将看到它在使用子查询和连接时所起的作用。在大多数情况下,联接相对较快

这里有一篇关于这个问题的好文章

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

请参阅本文中执行的测试:

我添加了100000个业务和150000条消息(随机类型 随机业务)

方法1:JOIN我一直认为连接比子查询快,所以我首先尝试了这种方法。(注:我不得不 将set SQL\u BIG\u SELECTS设置为1;甚至只是为了让查询运行……糟糕 签字!)

方法2:子查询,在其中,此方法由我的表弟发送给我。阅读和理解查询内容要容易得多 尝试做:

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

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

在大多数情况下,联接比子查询快,而且子查询很少更快。请不要将图像用于文本数据。今天写的这篇文章显示了解释结果、类似的派生表,所以我应该避免子查询?我是mysql新手,我的老师在连接之前教过子查询,所以我现在有点困惑。@AliceXu:-我不会说要
避免
它,但是的,当你发现可以使用连接编写相同的查询时,你可以更喜欢使用连接。这篇文章直接与你的结论相矛盾。注意,在选项3中,GROUP BY在加入之前限制子查询的结果。它将子查询的行数减少到每个业务1行,而不是每个消息1行。
  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