【发布时间】:2015-12-21 14:15:09
【问题描述】:
【问题讨论】:
-
在大多数情况下,JOIN 比子查询要快,而且很少有子查询更快。
-
请不要将图像用于文本数据。
-
今天写了这篇文章,展示了 explain 结果、类似的派生表 HERE
【问题讨论】:
如果您将使用 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
【讨论】:
avoid 说它,但是是的,只要您发现可以使用 JOINS 编写相同的查询,您就可以更喜欢使用 JOINS。
如果您要使用执行计划,您会看到不同之处。在优化方面,最好使用JOIN,而不是使用子查询,因为子查询可能会花费太多的执行时间,尤其是在处理大量数据时。
【讨论】: