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